【问题标题】:Detecting when you're in/out of the main thread in Xamarin.iOS检测您何时进入/退出 Xamarin.iOS 中的主线程
【发布时间】:2010-10-18 19:01:37
【问题描述】:

Xamarin/MonoTouch 有没有办法检测代码是否在主线程中被调用?

我正在寻找类似于 Java 的 EventQueue.isEventDispatchThread() 的东西——我在 Swing 编程中发现它对assert 很方便(有时对assert 不是这样)——确保模型持续更新并从 EDT 读取,并且长时间运行的调用不会阻塞 UI。

我想在我的 MonoTouch 应用程序中做同样的事情,以确保从 UI 调用/不调用各种代码,或包装在 InvokeOnMainThread 中。


已更新: 对于以后出现的任何人:Obj-C 来自 JP 的以下回答。 Xamarin/MonoTouch 等效项是 NSThread.Current.IsMainThread

【问题讨论】:

标签: multithreading ios xamarin.ios


【解决方案1】:

我对 Monotouch 了解不多,但在 iOS 中 +[NSThread isMainThread] 可能是您正在寻找的。​​p>

偶尔在写多线程代码的时候,我会放一个这样的断言:

NSAssert([NSThread isMainThread], @"Method called using a thread other than main!");

【讨论】:

    【解决方案2】:

    NSAssert([NSThread isMainThread], errorDesc) 的唯一问题是您最好在进行此调用时位于主线程中。如果您碰巧在辅助线程中并进行了调用,那么您的应用程序将崩溃!所以这有点毫无意义。

    最好只使用 [NSThread isMainThread] 然后评估它返回的 BOOL 值。

    【讨论】:

    • 你说得对,如果不是从主线程运行,我的答案中的 NSAssert 会使应用程序崩溃。这就是使用 NSAssert 的目的。在开发过程中,如果我的代码在非主线程中执行,我会使用该断言来提醒我。您不必使用我的回答中的 NSAssert - 您可以使用该功能做任何事情。 NSAssert 代码只是 +[NSThread isMainThread] 函数可能使用的一个示例。作为旁注,您的答案可能是对我的答案的评论,而不是一个完整的单独答案。
    【解决方案3】:

    您可以在 Monotouch / Xamarin.ios 中这样做

            if (NSThread.Current.IsMainThread)
            {
                //You are in the MainThread
            } 
    

    此检查对于避免尝试从后台线程修改 UI 时可能发生的错误非常有用。可以这样做:

    if (NSThread.Current.IsMainThread)
    {
        DoSomething();
    }
    else
    {
        BeginInvokeOnMainThread(() => DoSomething());
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多