2010-10-18 8 views
19

Gibt es einen Weg in Xamarin/MonoTouch zu erkennen, ob Code im Haupt-Thread aufgerufen wird?Erkennen, wenn Sie in/aus dem Hauptthread in Xamarin.iOS sind

Ich bin auf der Suche nach so etwas wie das Äquivalent von Java EventQueue.isEventDispatchThread() - ich habe in Swing-Programmierung fand es zu assert praktisch ist, dass von Zeit zu Zeit (oder manchmal zu assert, dass es nicht ist) - dafür sorgen, dass Modelle konsistent aktualisiert und aus dem EDT gelesen, und dass lang andauernde Aufrufe die Benutzeroberfläche nicht blockieren.

Ich möchte das gleiche in meiner MonoTouch-App tun, um sicherzustellen, dass verschiedene Bits von Code nicht von der Benutzeroberfläche aufgerufen oder in InvokeOnMainThread verpackt werden.


aktualisiert: Für alle später zusammen kommen: Obj-C Antwort von JP unten. Das Xamarin/MonoTouch-Äquivalent ist NSThread.Current.IsMainThread.

+0

möglich Duplikat [Überprüfen Sie, ob der aktuelle Thread ist der Haupt-Thread] (http://stackoverflow.com/questions/3546539/check-whether-or-not- the-current-thread-is-the-main-thread) – bobobobo

+0

@bobobobo Diese Frage bezieht sich nicht direkt auf die Monotouch-Syntax. –

+0

Ich habe das [tag: monotouch] nicht bemerkt. Nun, die Antwort endete gleich. – bobobobo

Antwort

39

Ich weiß nicht viel über Monotouch, aber in iOS +[NSThread isMainThread] könnte das sein, was Sie suchen. Gelegentlich

wenn multithreaded Code zu schreiben, werde ich wie dies in einer Assertion setzen:

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

Das macht den Trick - danke! –

0

Das einzige Problem mit NSAssert([NSThread isMainThread], errorDesc) ist, dass Sie besser in dem Haupt-Thread, wenn Sie diesen Anruf. Wenn Sie zufällig in einem sekundären Thread sind und den Anruf tätigen, stürzt Ihre Anwendung ab! Es ist also sinnlos.

Es ist besser, einfach [NSThread isMainThread] zu verwenden und dann den zurückgegebenen BOOL-Wert zu bewerten.

+12

Sie haben Recht, dass die NSAusgabe in meiner Antwort die App zum Absturz bringt, wenn sie nicht vom Hauptthread ausgeführt wird. Das ist der Zweck der Verwendung eines NSAssert. Während der Entwicklung verwende ich diese Behauptung, um mich zu warnen, wenn mein Code jemals in einem Nicht-Haupt-Thread ausgeführt wird. Sie müssen nicht NSAsssert aus meiner Antwort verwenden - Sie können alles mit dieser Funktion tun. Der NSAswert-Code ist nur ein Beispiel für eine mögliche Verwendung für die Funktion + [NSThread isMainThread]. Als Nebenbemerkung hätte Ihre Antwort wahrscheinlich eher eine Antwort auf meine Antwort sein können als eine ganz eigene Antwort. –

0

Sie können

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

Diese Prüfung ist sehr nützlich in Monotouch/Xamarin.ios wie dies tun, um den Fehler zu vermeiden, die auftreten können, wenn die Benutzeroberfläche von einem Hintergrund-Thread zu ändern versuchen. So etwas kann geschehen:

if (NSThread.Current.IsMainThread) 
{ 
    DoSomething(); 
} 
else 
{ 
    BeginInvokeOnMainThread(() => DoSomething()); 
} 
Verwandte Themen