Xamarin.Forms 后台线程
Xamarin.Forms Background Thread
我正在尝试获得一个非常简单的应用程序 运行 列表 google 任务。
我有一个 SQLite 本地数据库,我想同步/尝试定期与 Google 的服务器同步。
我只想 运行 一个简单的后台线程,这样它就可以在所有设备上轻松运行。
在 PCL 项目 (Xamarin.Forms) 中创建后台线程时出现问题
我似乎找不到合适的制作方法。
目前我只有第二个话题运行:
private bool Sync() { //Does stuffs }
private void SynchronizeData()
{
// Repeats sync process every 35s
Device.StartTimer (new TimeSpan (0, 0, 35), Sync);
}
// Is called pretty much when app starts.
private void StartSynchronizationThread()
{
Task.Factory.StartNew(SynchronizeData,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
}
尽管考虑到操作计数确实很低(最坏的测试情况下阻塞时间不到一秒),但无论如何这应该不是什么大问题,但我在线程应该运行时遇到了我的应用程序的大规模冻结运行 第一。 (定时器第一次到期)
冻结持续了好一分钟...
一旦它发生,我就可以永远留在应用程序上,而不会出现任何问题。不过,我注意到以下内容出现得比较晚:
[art]
Thread[2,tid=2532,WaitingInMainSignalCatcherLoop,Thread*=0xee170800,peer=0x12c00080,"Signal
Catcher"]: reacting to signal 3 [art] Wrote stack traces to
'/data/anr/traces.txt' [art] Wrote stack traces to
'/data/anr/traces.txt' [art]
Thread[2,tid=2532,WaitingInMainSignalCatcherLoop,Thread*=0xee170800,peer=0x12c00080,"Signal
Catcher"]: reacting to signal 3 [art] Wrote stack traces to
'/data/anr/traces.txt'
虽然痕迹并没有真正给我更多的信息......
但这可能与它有关。
有人对这件事有什么暗示吗?包、代码示例或任何东西?
希望我错过了一些大事;
谢谢。
在实际设备上运行正常,问题与模拟器有关。 (虽然还没有找到解决办法)
在 Xamarin 表单中,您必须本地化才能执行适当的后台任务,如下所述:
Backgrounding with Xamarin Forms
要成为本机,您需要使用 Xamarin MessagingCenter 将消息来回发送到适当的后台任务(取决于您想要实现的目标)。例如,在 Android:
中定义一个服务
[Service]
class YourService : Service
{
public override IBinder OnBind(Intent intent)
{
return null;
}
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
// Do your thang!
}
}
我正在尝试获得一个非常简单的应用程序 运行 列表 google 任务。 我有一个 SQLite 本地数据库,我想同步/尝试定期与 Google 的服务器同步。
我只想 运行 一个简单的后台线程,这样它就可以在所有设备上轻松运行。
在 PCL 项目 (Xamarin.Forms) 中创建后台线程时出现问题 我似乎找不到合适的制作方法。
目前我只有第二个话题运行:
private bool Sync() { //Does stuffs }
private void SynchronizeData()
{
// Repeats sync process every 35s
Device.StartTimer (new TimeSpan (0, 0, 35), Sync);
}
// Is called pretty much when app starts.
private void StartSynchronizationThread()
{
Task.Factory.StartNew(SynchronizeData,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
}
尽管考虑到操作计数确实很低(最坏的测试情况下阻塞时间不到一秒),但无论如何这应该不是什么大问题,但我在线程应该运行时遇到了我的应用程序的大规模冻结运行 第一。 (定时器第一次到期) 冻结持续了好一分钟...
一旦它发生,我就可以永远留在应用程序上,而不会出现任何问题。不过,我注意到以下内容出现得比较晚:
[art] Thread[2,tid=2532,WaitingInMainSignalCatcherLoop,Thread*=0xee170800,peer=0x12c00080,"Signal Catcher"]: reacting to signal 3 [art] Wrote stack traces to '/data/anr/traces.txt' [art] Wrote stack traces to '/data/anr/traces.txt' [art] Thread[2,tid=2532,WaitingInMainSignalCatcherLoop,Thread*=0xee170800,peer=0x12c00080,"Signal Catcher"]: reacting to signal 3 [art] Wrote stack traces to '/data/anr/traces.txt'
虽然痕迹并没有真正给我更多的信息...... 但这可能与它有关。
有人对这件事有什么暗示吗?包、代码示例或任何东西? 希望我错过了一些大事;
谢谢。
在实际设备上运行正常,问题与模拟器有关。 (虽然还没有找到解决办法)
在 Xamarin 表单中,您必须本地化才能执行适当的后台任务,如下所述: Backgrounding with Xamarin Forms
要成为本机,您需要使用 Xamarin MessagingCenter 将消息来回发送到适当的后台任务(取决于您想要实现的目标)。例如,在 Android:
中定义一个服务[Service]
class YourService : Service
{
public override IBinder OnBind(Intent intent)
{
return null;
}
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
// Do your thang!
}
}