2016-03-01 76 views
2

我会尽量保持这个简短和甜蜜。 我有这样的代码,其是被按下的按钮的结果(因此其对主UI线程)Xamarin.iOS主线和后台线程打得不好

MessageCenter.Init(); 

上述方法执行此(以及其它事情)

NS = NSTimer.CreateRepeatingScheduledTimer(TimeSpan.Parse("00:00:30"), delegate 
       { 
        NSObject.InvokeInBackground(() => 
         { 

          HandleElapsed(); 

         }); 


       }); 

HandleElapsed();使用Monitor.Enter(obj)方法获取对象的排他锁。意味着主UI线程也可能需要获得排他锁。 (锁定到位,以确保sqlite的数据的完整性)

当主UI遇到的对象上的锁(即其已锁定)整个应用程序只是停止(包括后台线程)

我应该提当UI被告知更改其内容时,可能需要获取锁定。 HandleElapsed();将要求主UI线程更改其内容。

NSNotificationCenter.DefaultCenter.PostNotificationName("ChangeDetail", new NSString("News")); 

请注意在内容完成变更主线程

UIApplication.SharedApplication.InvokeOnMainThread(); 

它似乎当粘贴在锁定主UI ...它也不允许后台线程继续因此后台线程不能移动的呼吁Monitor.Exit();

我错过了什么?

回答

0

解决了它。

我保持整个数据库的开放性。和简单应用的锁定机制

lock(SQLight.Connection) 
{ 
    ... 
} 

这意味着我的所有线程使用相同的连接,但每个线程只能反过来的数据进行交互。

这似乎已经达到我想要的