Xamarin / MonoTouch中是否有办法检测主线程中是否正在调用代码?
我正在寻找类似于Java EventQueue.isEventDispatchThread()
的东西 - 我在Swing编程中发现它对assert
不时(或有时候到assert
很方便但事实并非如此) - 确保模型始终如一地更新并从EDT中读取,并且长时间运行的调用不会阻止UI。
我想在我的MonoTouch应用程序中执行相同操作,以确保不会从UI调用各种代码,或将其包含在InvokeOnMainThread
中。
更新:对于稍后出席的任何人:Obj-C来自JP的答案。 Xamarin / MonoTouch等效项为NSThread.Current.IsMainThread
。
答案 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());
}