Xamarin.Forms背景线程

时间:2015-02-17 16:51:46

标签: multithreading xamarin sync background-thread

我试图让一个非常简单的应用程序运行列表google Task。 我有一个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);
    }

虽然考虑到操作计数真的很低(但最糟糕的情况是测试目的,它的阻塞时间不到一秒),它应该不是一个很大的问题。当线程应该是什么时,我的应用程序大量冻结跑了第一个。 (计时器首次到期) 冻结持续了一段时间......

一旦它被摧毁,我可以永远留在应用程序上,没有一个问题。我注意到以下情况很晚才出现:

  

[技术]   螺纹[2,TID = 2532,WaitingInMainSignalCatcherLoop,螺纹* = 0xee170800,同行= 0x12c00080,"信号   Catcher"]:对信号3做出反应[艺术]写入堆栈跟踪   ' /data/anr/traces.txt' [艺术]写了堆栈跟踪   ' /data/anr/traces.txt' [艺术]   螺纹[2,TID = 2532,WaitingInMainSignalCatcherLoop,螺纹* = 0xee170800,同行= 0x12c00080,"信号   Catcher"]:对信号3做出反应[艺术]写入堆栈跟踪   ' /data/anr/traces.txt'

Traces并没有真正给我更多的信息.​​..... 但它可能与它有关。

任何人都有关于此事的暗示?包,代码示例还是其他什么? 希望我错过了一些重要的事情;

感谢。

2 个答案:

答案 0 :(得分:1)

在实际设备上像魅力一样工作,问题与模拟器相关联。 (但是Haven没有找到解决方法)

答案 1 :(得分:0)

在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!
    }
}