【问题标题】:Xamarin.iOS main and background threads not playing niceXamarin.iOS 主线程和后台线程不能正常运行
【发布时间】:2016-03-01 10:12:48
【问题描述】:

我会尽量保持简短和甜蜜。 我有这个代码是按下按钮的结果(所以它在主 UI 线程上)

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();

当主用户界面卡在锁上时,它似乎......它也不允许后台线程继续,因此后台线程无法继续调用Monitor.Exit();

我错过了什么吗?

【问题讨论】:

    标签: c# ios multithreading xamarin.ios monitor


    【解决方案1】:

    解决了。

    我始终保持数据库打开。并简单地应用了锁定机制

    lock(SQLight.Connection)
    {
         ...
    }
    

    这意味着我的所有线程都使用相同的连接,但每个线程只能依次与数据交互。

    这似乎达到了我想要的效果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多