2 Stimmen

Ausführung in neuem Thread erzwingen

Ich habe einen solchen Code in meiner Anwendung:

var t = new Thread(new ThreadStart(new Action(SomeClass.SomeMethod)));
t.Start();
...
t.Join();

aber so wie ich es verstehe, führt der Compiler eine Optimierung durch und führt SomeMethod im selben Thread aus wie der Hauptcode. Ich überprüfe dies, indem ich verschiedene Namen des Threads in t und Thread.CurrentThread einstelle. Wie kann ich einen Thread erstellen und ausführen, um sicher zu sein, dass es ein neuer Thread ist?

5voto

Mark Byers Punkte 761508

Der Compiler wird no Ihren Code auf diese Weise zu optimieren. Der Code wird in einem neuen .NET-Thread ausgeführt. Es muss ein Fehler in der Art und Weise vorliegen, wie Sie Ihre Beobachtungen gemacht haben.

Beachten Sie, dass .NET-Threads nicht unbedingt mit OS-Threads gleichzusetzen sind:

Eine ThreadId des Betriebssystems hat keine feste Beziehung zu einem verwalteten Thread, da ein nicht verwalteter Host die Beziehung zwischen verwalteten und nicht verwalteten Threads kontrollieren kann. Insbesondere kann ein ausgeklügelter Host die CLR-Hosting-API verwenden, um viele verwaltete Threads für denselben Betriebssystem-Thread einzuplanen oder um einen verwalteten Thread zwischen verschiedenen Betriebssystem-Threads zu verschieben.

Theoretisch könnten Sie zwei verwaltete Threads mit der gleichen Windows-Thread-ID sehen, aber die Thread.Name Eigenschaft immer noch unterschiedlich sein (vorausgesetzt, Sie haben die Namen zunächst auf zwei unterschiedliche Werte gesetzt).

Wenn Sie den von Ihnen verwendeten Code posten könnten, bei dem Sie beobachtet haben, dass etwas im falschen Thread ausgeführt wird, könnte es möglich sein, den Fehler zu entdecken, den Sie gemacht haben.

1voto

Mitch Wheat Punkte 287474

Ich glaube, Sie haben einen Fehler in Ihrem Code gemacht. Versuchen Sie dies:

Thread.CurrentThread.Name = "main";

var t = new Thread(new ThreadStart(new Action(SomeClass.SomeMethod))); 
t.Name = "worker";

t.Start(); 
// ... 
t.Join(); 

Beachten Sie, dass Thema.Name ist eine einmalig beschreibbare Eigenschaft. Es ist daher eine schlechte Idee, Threadpool-Threads zu benennen!

1voto

KeithS Punkte 67713

Wenn Sie einem Programm sagen, dass es eine Aufgabe in einem neuen Thread ausführen soll, wird genau das passieren. Diese beiden Threads können am Ende auf demselben Kern laufen (weil der aufrufende Thread möglicherweise nicht viel tut, außer auf den Abschluss des anderen Threads zu warten), aber Sie werden zwei verschiedene Speicherbereiche und Ausführungszeiger in Ihrem Prozess haben.

Eine einfache Möglichkeit, dies zu überprüfen, besteht darin, den Task-Manager zu öffnen, einen Haltepunkt in SomeMethod zu setzen, die Thread-Anzahl von VS (devenv.exe) auf der Registerkarte Prozesse zu überprüfen und dann auf die Schaltfläche Debuggen zu klicken, um Ihr Programm zu starten. Wenn der Haltepunkt erreicht ist, überprüfen Sie die Thread-Anzahl erneut; Sie werden zwei neue Threads haben, einen für den Hauptausführungsablauf des Programms und einen für Ihren Worker-Thread. Möglicherweise gibt es einen weiteren für den angehängten Debugger.

0voto

Paw Baltzersen Punkte 2502

Warum nicht die Aufgabenbibliothek verwenden? (wenn Sie .NET 4.0 verwenden)

Task task = Task.Factory.StartNew(() => 
             {
                 // your code here, this will be executed in a Task thread
             });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X