Wie Sie sagen, wenn ein thread den Haupt-thread in C#
Ich weiß, es gibt andere Beiträge, die sagen, Sie können ein Steuerelement erstellen, und dann überprüfen Sie die InvokeRequired
- Eigenschaft, um zu sehen, ob der aktuelle thread ist der Haupt-thread ist oder nicht.
Das problem ist, dass Sie haben keine Möglichkeit zu wissen, wenn das control selbst erstellt wurde, auf dem Haupt-thread.
Ich bin mit dem folgenden code zu sagen, wenn ein thread ist der Haupt-thread (der thread, der den Prozess gestartet):
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA ||
Thread.CurrentThread.ManagedThreadId != 1 ||
Thread.CurrentThread.IsBackground || Thread.CurrentThread.IsThreadPoolThread)
{
//not the main thread
}
Weiß jemand einen besseren Weg? Es scheint, wie diese Art und Weise könnte anfällig für Fehler oder Bruch in zukünftigen Versionen der Laufzeitumgebung.
InformationsquelleAutor der Frage jjxtra | 2010-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man es so machen:
BEARBEITEN ich merkte, Sie könnte es mit der Reflexion auch hier ist ein snippet:
InformationsquelleAutor der Antwort Zach Johnson
Wenn Sie mit Windows Forms oder WPF, können Sie überprüfen, um zu sehen, ob SynchronizationContext.Aktuelle ist nicht null.
Den Haupt-thread um eine gültige SynchronizationContext gesetzt, um den aktuellen Kontext nach dem Start in Windows Forms und WPF.
InformationsquelleAutor der Antwort Reed Copsey
Hier ist eine weitere option:
Funktioniert für mich.
EDIT : Vergessen zu erwähnen, dass dies nur in WPF. Ich war auf der Suche SO für die WPF-Fall, und ich habe nicht bemerkt, dass diese Frage allgemein .NET. Eine weitere option für die Windows Forms werden konnte
Natürlich sollten Sie zuerst sicherstellen, dass es mindestens ein
Form
in der Anwendung.InformationsquelleAutor der Antwort cheeesus
Versuchen, diese
if (Application.MessageLoop)
. Ich denke, es ist der seltene Fall mehr als 1 thread zum verarbeiten von NachrichtenInformationsquelleAutor der Antwort Andrey
In meiner Erfahrung, wenn Sie versuchen, erstellen Sie einen dialog aus einem anderen thread als dem Hauptthread dann windows wird alle verwirrt, und die Dinge beginnen, verrückt zu werden. Ich habe versucht zu tun, einmal mit einem status-Fenster zeigt den status der hintergrund-thread (wie auch viele andere mal jemand werfen einen dialog aus einem hintergrund-thread und habe eine Message-Loop) - und Windows nur angefangen, "random" Sachen im Programm. Ich bin mir ziemlich sicher, es gab einige unsichere Handhabung von etwas Los. Hatte Probleme mit einem Klick auf die form und den falschen Umgang mit den Nachrichten...
So, ich würde nie irgendwelche UI kommen von Überall, aber der Haupt-thread.
Allerdings, Warum nicht einfach speichern aus dem CurrentThread wenn Sie beginnen, und vergleichen Sie die ThreadID mit dem aktuellen thread?
-Chert
InformationsquelleAutor der Antwort Chert Pellett