2016-03-01 30 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) 
{ 
    ... 
} 

這意味着我的所有線程使用相同的連接,但每個線程只能反過來的數據進行交互。

這似乎已經達到我想要的