2016-03-01 2 views
2

Я постараюсь сохранить это короткое и сладкое. У меня этот код, который является результатом, что кнопка будет нажата (поэтому его в основном потоке пользовательского интерфейса)Xamarin.iOS основные и фоновые темы не играют хорошо

MessageCenter.Init(); 

вышеуказанный способ делает это (как и другие вещи)

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

          HandleElapsed(); 

         }); 


       }); 

HandleElapsed(); получает эксклюзивную блокировку объекта с использованием метода Monitor.Enter(obj). в то время как основной нити ui также может потребоваться получить эксклюзивный замок. (Замок находится в месте, чтобы обеспечить целостность SQLITE данных)

, когда основной интерфейс встречает блокировку на объект (т.е. его уже заблокирован) все приложение просто останавливается (включая фоновый поток)

Я должен упомянуть пользовательскому интерфейсу может потребоваться блокировка, когда ему будет предложено изменить его содержимое. HandleElapsed(); попросит основной поток пользовательского интерфейса изменить его содержимое.

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

обратите внимание на изменение содержимого завершается в основном потоке

UIApplication.SharedApplication.InvokeOnMainThread(); 

его, кажется, когда основной пользовательский интерфейс застрял на замок ... его также не позволяет фоновый поток в продолжить, поэтому фоновый поток не может переместиться по вызову на Monitor.Exit();

Я что-то не хватает?

ответ

0

Решено.

Я хранил базу данных в открытом доступе. и просто приложил стопорный механизм

lock(SQLight.Connection) 
{ 
    ... 
} 

это означает, что все мои потоки используют одно и то же соединение, но каждый поток может взаимодействовать только с данными.

Это, кажется, достигло того, что я хотел

Смежные вопросы