在Xamarin.iOS中检测你进入/离开主线程的时间

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

我正在寻找类似于Java的EventQueue.isEventDispatchThread() – 我在Swing编程中发现它可以方便地assert (或者有时assert它不是) – 确保模型是持续更新并从EDT中读取,长时间运行的调用不会阻止用户界面。

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


更新:对于后来的人来说: Obj-C来自JP下面的答案。 Xamarin / MonoTouch等价物是NSThread.Current.IsMainThread

我不太了解Monotouch,但是在iOS +[NSThread isMainThread]可能就是你要找的东西。

偶尔在编写multithreading代码时,我会放入这样的断言:

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

NSAssert([NSThread isMainThread], errorDesc)唯一的问题是NSAssert([NSThread isMainThread], errorDesc)是你在进行这个调用时在主线程中更好。 如果您恰好在辅助线程中并进行通话,那么您的应用程序将崩溃! 所以这是毫无意义的。

最好是简单地使用[NSThread isMainThread]然后评估它返回的BOOL值。

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

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

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

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