检测您何时进入/离开Xamarin.iOS中的主线程

时间:2010-10-18 19:01:38

标签: multithreading ios xamarin.ios

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

我正在寻找类似于Java EventQueue.isEventDispatchThread()的东西 - 我在Swing编程中发现它对assert不时(或有时候到assert很方便但事实并非如此) - 确保模型始终如一地更新并从EDT中读取,并且长时间运行的调用不会阻止UI。

我想在我的MonoTouch应用程序中执行相同操作,以确保不会从UI调用各种代码,或将其包含在InvokeOnMainThread中。


更新:对于稍后出席的任何人:Obj-C来自JP的答案。 Xamarin / MonoTouch等效项为NSThread.Current.IsMainThread

3 个答案:

答案 0 :(得分:41)

我对Monotouch了解不多,但在iOS +[NSThread isMainThread]中可能就是你想要的。

有时候在编写多线程代码时,我会输入一个这样的断言:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以在Monotouch / Xamarin.ios中执行此操作

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

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

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