Der allgemeine Ansatz ist wie folgt:
using System;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
int clickCount = 0;
public Form1()
{
InitializeComponent();
label1.SetText("0");
}
private void button1_Click(object sender, EventArgs e)
{
new Thread(() => label1.SetText((++clickCount).ToString())).Start();
}
}
public static class ControlExtensions
{
public static void SetText(this Control control, string text)
{
if (control.InvokeRequired)
control.Invoke(setText, control, text);
else
control.Text = text;
}
private static readonly Action<Control, string> setText =
(control, text) => control.Text = text;
}
}
Erläuterung :
Die Antwort lautet in etwa so este . Aber es verwendet eine sauberere (wie für mich) und neuere Syntax. Der Punkt ist InvokeRequired
Eigenschaft von control
. Es erhält einen Wert, der angibt, ob der Aufrufer eine Invoke-Methode aufrufen muss, wenn er Methodenaufrufe an das Steuerelement vornimmt, weil der Aufrufer sich in einem anderen Thread befindet als der, in dem das Steuerelement erstellt wurde. Wenn wir also aufrufen control.SetText("some text")
in demselben Thread control
erstellt wurde, ist es in Ordnung, einfach die Text
wie diese control.Text = text
. Aber bei jedem anderen Thema verursacht es System.InvalidOperationException
also muss man eine Methode über control.Invoke(...)
zum Einstellen Text
zum Thema control
wurde erstellt am.
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