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