2010-10-18 24 views
19

¿Hay alguna manera en Xamarin/MonoTouch para detectar si se está llamando al código en el hilo principal?Detectando cuando está dentro/fuera del hilo principal en Xamarin.iOS

Busco algo así como el equivalente de Java de EventQueue.isEventDispatchThread() - que he encontrado en la programación de oscilación que es muy práctico para assert que de vez en cuando (o, a veces a assert que no lo es) - asegurándose de que los modelos son consistentemente actualizado y leído del EDT, y que las llamadas de larga ejecución no bloquean la UI.

Me gustaría hacer lo mismo en mi aplicación MonoTouch, para asegurar que varios bits de código no son llamados desde la interfaz de usuario, o envueltos en InvokeOnMainThread.


Actualizado: Para cualquiera que venga a lo largo de más adelante: Obj-C respuesta de JP continuación. El equivalente de Xamarin/MonoTouch es NSThread.Current.IsMainThread.

+0

posible duplicado de [Compruebe si el hilo actual es el hilo principal] (http://stackoverflow.com/questions/3546539/check-whether-or-not- the-current-thread-is-the-main-thread) – bobobobo

+0

@bobobobo Esa pregunta no aborda directamente la sintaxis de Monotouch. –

+0

No noté la [etiqueta: monotouch]. Bueno, la respuesta terminó siendo la misma. – bobobobo

Respuesta

39

No sé mucho sobre Monotouch, pero en iOS +[NSThread isMainThread] podría ser lo que estás buscando.

De vez en cuando al escribir código multiproceso, voy a poner en una aserción como esto:

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

Eso hace el truco, ¡gracias! –

0

El único problema con NSAssert([NSThread isMainThread], errorDesc) es que es mejor estar en el hilo principal al hacer esta llamada. Si te encuentras en un hilo secundario y realizas la llamada, ¡tu aplicación se bloquea! Entonces es algo sin sentido.

Es mejor simplemente usar [NSThread isMainThread] y luego evaluar el valor BOOL que devuelve.

+12

Tiene razón en que el NSAssert en mi respuesta bloqueará la aplicación si no se ejecuta desde el hilo principal. Ese es el propósito de usar un NSAssert. Durante el desarrollo, utilizo esa afirmación para alertarme si mi código se ejecuta alguna vez en un hilo no principal. No tiene que usar el NSAssert de mi respuesta; puede hacer cualquier cosa con esa función. El código NSAssert es solo un ejemplo de un uso posible para la función + [NSThread isMainThread]. Como nota al margen, su respuesta probablemente podría haber sido un comentario sobre mi respuesta en lugar de una respuesta por separado. –

0

Se puede hacer así en MonoTouch/Xamarin.ios

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

Esta comprobación es muy útil para evitar el error que pudiera ocurrir al intentar modificar la interfaz de usuario desde un subproceso en segundo plano. Algo como esto se puede hacer:

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