Label lblText; //initialized elsewhere
void AssignLabel(string text)
{
if (InvokeRequired)
{
BeginInvoke((Action<string>)AssignLabel, text);
return;
}
lblText.Text = text;
}
Beachten Sie, dass BeginInvoke()
ist vorzuziehen gegenüber Invoke()
weil es weniger wahrscheinlich ist, dass es zu Deadlocks kommt (dies ist jedoch kein Problem, wenn man einem Label nur Text zuweist):
Bei der Verwendung von Invoke()
Sie warten auf die Rückkehr der Methode. Nun kann es sein, dass Sie im aufgerufenen Code etwas tun, das auf den Thread warten muss, was vielleicht nicht sofort ersichtlich ist, wenn es in einigen Funktionen vergraben ist, die Sie aufrufen, was wiederum indirekt über Event-Handler geschehen kann. Sie würden also auf den Thread warten, der Thread würde auf Sie warten und Sie wären in einer Sackgasse.
Dies führte dazu, dass sich einige unserer veröffentlichten Softwareprogramme aufhängten. Es war einfach genug, dies zu beheben, indem man die Invoke()
con BeginInvoke()
. Wenn Sie keine Notwendigkeit für einen synchronen Betrieb haben, was der Fall sein kann, wenn Sie einen Rückgabewert benötigen, verwenden Sie BeginInvoke()
.
28 Stimmen
Hat .net 2.0+ nicht die BackgroundWorker-Klasse genau für diesen Zweck. Es UI Thread bewusst. 1. Erstellen Sie einen BackgroundWorker 2. Fügen Sie zwei Delegierte hinzu (einen für die Verarbeitung und einen für den Abschluss)
15 Stimmen
Vielleicht ein bisschen spät: codeproject.com/KB/cs/Threadsafe_formupdating.aspx
4 Stimmen
Siehe die Antwort für .NET 4.5 und C# 5.0: stackoverflow.com/a/18033198/2042090
5 Stimmen
Diese Frage bezieht sich nicht auf Gtk# GUI. Für Gtk# siehe diese y diese Antwort.
3 Stimmen
Vorsicht: Die Antworten auf diese Frage sind jetzt ein unübersichtliches Durcheinander von OT ("hier ist, was ich für meine WPF-Anwendung getan habe") und historischen .NET 2.0-Artefakten.
0 Stimmen
Ähnlicher Beitrag - GUI-Aktualisierung vom UI-Thread aus erzwingen