Sie müssen sicherstellen, dass die Aktualisierung im richtigen Thread erfolgt, nämlich dem UI-Thread.
Um dies zu tun, müssen Sie den Event-Handler aufrufen, anstatt ihn direkt aufzurufen.
Sie können dies tun, indem Sie Ihr Ereignis wie folgt anheben:
(Der Code ist hier aus dem Kopf getippt, ich habe ihn also nicht auf korrekte Syntax usw. geprüft, aber er sollte Ihnen weiterhelfen).
if( MyEvent != null )
{
Delegate[] eventHandlers = MyEvent.GetInvocationList();
foreach( Delegate d in eventHandlers )
{
// Check whether the target of the delegate implements
// ISynchronizeInvoke (Winforms controls do), and see
// if a context-switch is required.
ISynchronizeInvoke target = d.Target as ISynchronizeInvoke;
if( target != null && target.InvokeRequired )
{
target.Invoke (d, ... );
}
else
{
d.DynamicInvoke ( ... );
}
}
}
Beachten Sie, dass der obige Code in WPF-Projekten nicht funktioniert, da WPF-Steuerelemente nicht die ISynchronizeInvoke
Schnittstelle.
Um sicherzustellen, dass der obige Code mit Windows Forms und WPF und allen anderen Plattformen funktioniert, können Sie einen Blick auf die AsyncOperation
, AsyncOperationManager
y SynchronizationContext
Klassen.
Um Ereignisse auf diese Weise einfach auslösen zu können, habe ich eine Erweiterungsmethode erstellt, die es mir ermöglicht, das Auslösen eines Ereignisses durch einen einfachen Aufruf zu vereinfachen:
MyEvent.Raise(this, EventArgs.Empty);
Natürlich können Sie auch die Klasse BackGroundWorker verwenden, die diese Angelegenheit für Sie abstrahiert.
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