2010-10-18 9 views
19

C'è un modo in Xamarin/MonoTouch per rilevare se il codice viene chiamato nel thread principale?Rilevare quando entri/esci dal thread principale in Xamarin.iOS

Sto cercando qualcosa come l'equivalente di Java EventQueue.isEventDispatchThread() - ho trovato nella programmazione swing è utile per assert che di volta in volta (o, talvolta, a assert che non è) - fare in modo che i modelli sono costantemente aggiornato e letto dall'EDT e che le chiamate di lunga durata non bloccano l'interfaccia utente.

Mi piacerebbe fare lo stesso nella mia app MonoTouch, per garantire che i vari bit di codice non vengano/non vengono richiamati dall'interfaccia utente o racchiusi in InvokeOnMainThread.


Aggiornato: Per chiunque venendo in seguito: Obj-C risposta da JP sotto. L'equivalente Xamarin/MonoTouch è NSThread.Current.IsMainThread.

+0

possibile duplicato del [Controllare se il thread corrente è il filo conduttore] (http://stackoverflow.com/questions/3546539/check-whether-or-not- the-current-thread-is-the-main-thread) – bobobobo

+0

@bobobobo Quella domanda non affronta direttamente la sintassi di Monotouch. –

+0

Non ho notato il [tag: monotouch]. Bene, la risposta è stata la stessa. – bobobobo

risposta

39

Non so molto di Monotouch, ma in iOS +[NSThread isMainThread] potrebbe essere quello che stai cercando.

Di tanto in tanto durante la scrittura di codice multithread, io metterò in un'asserzione del genere:

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

Questo è il trucco - grazie! –

0

L'unico problema con NSAssert([NSThread isMainThread], errorDesc) è che è meglio essere nel thread principale quando si effettua la chiamata. Se ti capita di essere in un thread secondario e fai la chiamata, l'applicazione si blocca! Quindi è un po 'inutile.

È meglio utilizzare semplicemente [NSThread isMainThread] quindi valutare il valore BOOL restituito.

+12

Hai ragione che l'NSAssert nella mia risposta farà crashare l'app se non viene eseguita dal thread principale. Questo è lo scopo dell'utilizzo di un NSAssert. Durante lo sviluppo, utilizzo quell'asserzione per avvertirmi se il mio codice viene mai eseguito nel thread non principale. Non devi usare NSAssert dalla mia risposta: puoi fare qualsiasi cosa con quella funzione. Il codice NSAssert è solo un esempio di un possibile utilizzo per la funzione + [NSThread isMainThread]. Come nota a margine, probabilmente la tua risposta avrebbe potuto essere un commento sulla mia risposta anziché un'intera risposta separata. –

0

Si può fare come questo in MonoTouch/Xamarin.ios

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

Questo controllo è molto utile per evitare l'errore che potrebbero verificarsi quando si tenta di modificare l'interfaccia utente da un thread in background. Qualcosa di simile può essere fatto:

if (NSThread.Current.IsMainThread) 
{ 
    DoSomething(); 
} 
else 
{ 
    BeginInvokeOnMainThread(() => DoSomething()); 
} 
Problemi correlati