2014-10-19 10 views
7

Wie kann ich überprüfen, ob der Thread, auf dem ich bin, der Unity-Thread ist?Finden Sie heraus, ob ich im Einheits-Thread bin

Ich versuchte, die threadId zur Zeit des Konstruktors zu erfassen, aber irgendwo während der Laufzeit des Programms bewegt sich die threadId.

In meinem Projekt benötigen einige sekundäre Thread-Prozesse Zugriff auf ein neu erstelltes Objekt.
Ich verwende das Producer-Consumer-Muster, damit sie im Unity-Thread erstellt werden können. Eine Objektfactory stellt eine Anfrage in die Warteschlange und unter Update() werden die angeforderten Objekte im richtigen Thread instanziiert. Zwischen Queued und Instanziiert wartet die Factory-Methode auf ein ObjectCreated-Ereignis mit einem AutoResetEvent.

Nun wird diese Factory manchmal vom Haupt-Thread aufgerufen und das AutoResetEvent blockiert seinen eigenen Thread. Ich versuchte es auch die schmutzige Art und Weise mit

// First try on this thread 
try 
{ 
    return action(); 
} 
catch (ArgumentException ex) 
{ 
    Debug.Log("Tried on same thread, but failed. "+ex.Message); 
} 
PushToQueueAndWait(action); 

Aber als Einheit der Ausnahme auslöst, gefangen oder nicht, hält das Programm.

Wenn ich überprüfen könnte, ob ich auf dem richtigen Thread bin, könnte ich zwischen der Warteschlange wechseln und nur ausführen.

+0

Ich habe noch nie die Haupt threadID Veränderung zu sehen ist, wie werden Sie den Wert zu bekommen? 'System.Threading.Thread.CurrentThread.ManagedThreadId' funktioniert bei mir und ändert sich nicht, solange meine Tests laufen. Außerdem kann das Ausführen von Thread-Code im Vorschaumodus des Unity-Editors zu einem unerwarteten Verhalten führen. – Jerdak

+0

System.Threading.Thread.CurrentThread.ManagedThreadId scheint sich von dem zu ändern, was es zur Zeit des Konstruktors ist und was irgendwo auf halbem Wege läuft. Ich kenne keine Details. Ich habe irgendwo gelesen, dass es etwas mit dem Editor zu tun haben könnte. Versuchen, weniger vage zu sein, haben aber noch kein Muster gefunden. –

+0

Ich bin skeptisch, dass der Hauptthread von Unity sich jemals ändern könnte. Das würde bedeuten, dass es die Hauptereignisschleife einfriert, diesen Status in einen neuen Thread kopiert und die Schleife neu startet. Unity unterstützt Multithreading nicht, daher ist es schwer vorstellbar, warum sie so etwas konstruieren. Wenn Sie ein funktionierendes Beispiel für das Problem entwickeln, wäre es schön zu sehen. – Jerdak

Antwort

8

Ich löste es durch den gesamten Thread zu erfassen und gleich es dann etwa so:

public void Start(){ 
    mainThread = System.Threading.Thread.CurrentThread; 
} 

bool isMainThread(){ 
    return mainThread.Equals(System.Threading.Thread.CurrentThread); 
} 

Verwandte: http://answers.unity3d.com/questions/62631/i-wonder-about-thread-id-plz-answer-me.html

+0

Beachten Sie, dass 'Update()' immer auf den Haupt-Thread aufgerufen wird, also überprüfen Ob Sie im Hauptthread von 'Update()' sind, führt immer zu 'true'. Ich bearbeite die Antwort, um sie in einer Funktion zu überprüfen, die von jedem Thread aufgerufen werden kann. – Tom

Verwandte Themen