Обнаружение, когда вы находитесь в/из основного потока в Xamarin.iOS
Есть ли способ в Xamarin/MonoTouch, чтобы определить, вызывается ли код в основном потоке?
Я ищу что-то вроде эквивалента Java EventQueue.isEventDispatchThread()
- я нашел в Swing-программировании его время от времени assert
, которое время от времени (или иногда до assert
, что это не так) - следя за тем, чтобы модели последовательно обновлялись и считывались с EDT, а длительные вызовы не блокировали пользовательский интерфейс.
Я хотел бы сделать то же самое в своем приложении MonoTouch, чтобы гарантировать, что различные биты кода/не вызывается из пользовательского интерфейса или завернуты в InvokeOnMainThread
.
Обновлено: Для тех, кто придет позже: Obj-C ответьте на JP ниже. Эквивалент Xamarin/MonoTouch составляет NSThread.Current.IsMainThread
.
Ответы
Ответ 1
Я мало знаю о Monotouch, но в iOS +[NSThread isMainThread]
может быть то, что вы ищете.
Иногда, когда вы пишете многопоточный код, я вставляю такое утверждение:
NSAssert([NSThread isMainThread], @"Method called using a thread other than main!");
Ответ 2
Единственная проблема с NSAssert([NSThread isMainThread], errorDesc)
заключается в том, что вы получаете BETTER в основном потоке при выполнении этого вызова. Если вы попали во вторичный поток и выполните вызов, ваше приложение сработает! Так что это бессмысленно.
Лучше просто использовать [NSThread isMainThread]
, затем оценить значение BOOL, которое оно возвращает.
Ответ 3
Вы можете сделать это в Monotouch/Xamarin.ios
if (NSThread.Current.IsMainThread)
{
//You are in the MainThread
}
Эта проверка очень полезна, чтобы избежать ошибки, которая может возникнуть при попытке изменить пользовательский интерфейс из фонового потока. Что-то вроде этого можно сделать:
if (NSThread.Current.IsMainThread)
{
DoSomething();
}
else
{
BeginInvokeOnMainThread(() => DoSomething());
}