Подтвердить что ты не робот

Обнаружение, когда вы находитесь в/из основного потока в Xamarin.iOS

Есть ли способ в Xamarin/MonoTouch, чтобы определить, вызывается ли код в основном потоке?

Я ищу что-то вроде эквивалента Java EventQueue.isEventDispatchThread() - я нашел в Swing-программировании его время от времени assert, которое время от времени (или иногда до assert, что это не так) - следя за тем, чтобы модели последовательно обновлялись и считывались с EDT, а длительные вызовы не блокировали пользовательский интерфейс.

Я хотел бы сделать то же самое в своем приложении MonoTouch, чтобы гарантировать, что различные биты кода/не вызывается из пользовательского интерфейса или завернуты в InvokeOnMainThread.


Обновлено: Для тех, кто придет позже: Obj-C ответьте на JP ниже. Эквивалент Xamarin/MonoTouch составляет NSThread.Current.IsMainThread.

4b9b3361

Ответ 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());
}