Salvete! Nachdem ich nach dieser Frage gesucht habe, fand ich die Antworten bei FrankG y Der Geist von Oregon die für mich am einfachsten und nützlichsten sind. Ich programmiere in Visual Basic und habe dieses Snippet durch einen Konverter laufen lassen, daher bin ich mir nicht ganz sicher, wie es ausgeht.
Ich habe ein Dialogformular namens form_Diagnostics,
die ein Feld für den Rechtstext enthält, das updateDiagWindow,
die ich als eine Art Logging-Display verwende. Ich musste in der Lage sein, den Text aus allen Threads zu aktualisieren. Die zusätzlichen Zeilen ermöglichen es dem Fenster, automatisch zu den neuesten Zeilen zu blättern.
Und so kann ich jetzt die Anzeige mit einer Zeile aktualisieren, von überall im gesamten Programm, so wie Sie denken, dass es ohne Threading funktionieren würde:
form_Diagnostics.updateDiagWindow(whatmessage);
Hauptcode (innerhalb des Klassencodes Ihres Formulars):
#region "---------Update Diag Window Text------------------------------------"
// This sub allows the diag window to be updated by all threads
public void updateDiagWindow(string whatmessage)
{
var _with1 = diagwindow;
if (_with1.InvokeRequired) {
_with1.Invoke(new UpdateDiagDelegate(UpdateDiag), whatmessage);
} else {
UpdateDiag(whatmessage);
}
}
// This next line makes the private UpdateDiagWindow available to all threads
private delegate void UpdateDiagDelegate(string whatmessage);
private void UpdateDiag(string whatmessage)
{
var _with2 = diagwindow;
_with2.appendtext(whatmessage);
_with2.SelectionStart = _with2.Text.Length;
_with2.ScrollToCaret();
}
#endregion
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