Meine Version besteht darin, Folgendes einzufügen eine Zeile eines rekursiven "Mantras":
Für keine Argumente:
void Aaaaaaa()
{
if (InvokeRequired) { Invoke(new Action(Aaaaaaa)); return; } //1 line of mantra
// Your code!
}
Für eine Funktion, die Argumente hat:
void Bbb(int x, string text)
{
if (InvokeRequired) { Invoke(new Action<int, string>(Bbb), new[] { x, text }); return; }
// Your code!
}
DAS ist es .
Einige Argumente : Normalerweise ist es schlecht für die Lesbarkeit des Codes, {} nach einer if ()
Anweisung in einer Zeile. Aber in diesem Fall handelt es sich um ein routinemäßiges "Mantra". Die Lesbarkeit des Codes wird nicht beeinträchtigt, wenn diese Methode über das gesamte Projekt hinweg konsistent ist. Und es bewahrt Ihren Code vor Vermüllung (eine Zeile Code anstelle von fünf).
Wie Sie sehen if(InvokeRequired) {something long}
Sie wissen einfach, dass "diese Funktion sicher von einem anderen Thread aus aufgerufen werden kann".
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