Ich habe diese Form, die einen neuen Thread hervorbringt und beginnt zu hören und warten auf UDP-Pakete in einer Schleife. Was ich brauche, ist, die Benutzeroberfläche mit der Anzahl der empfangenen Bytes aktualisiert zu halten.Wie wird die Benutzeroberfläche beim Übertragen von Paketen in C# ordnungsgemäß aktualisiert?
Dafür habe ich ein Ereignis eingerichtet, das ich erhalte, sobald ein Paket empfangen wird und übergeben die Anzahl der Bytes als ein Argument erhalten. Da ich den UI-Thread nicht ausführe, kann ich die Benutzeroberfläche nicht einfach direkt aktualisieren. Hier ist, was ich momentan mache:
private void EVENTHANDLER_UpdateTransferProgress(long receivedBytes) {
if(InvokeRequired) {
Invoke(new MethodInvoker(() => {
totalReceivedBytes += receivedBytes;
Label.Text = totalReceivedBytes.ToString("##,0");
}));
}
}
Aber das ist noch auf dem gleichen Thread wie die Paketempfangsschleife läuft und es wird nicht zu dieser Schleife zurückkehren - und für ein anderes Paket warten - bis zu dieser EVENTHANDLER_UpdateTransferProgress
Methode kehrt zurück.
Meine Frage ist im Grunde über die folgende Zeile in dem Verfahren, das oben:
Label.Text = totalReceivedBytes.ToString("##,0");
Aktualisierung der Benutzeroberfläche wie dies der Paketempfang verlangsamt. Wenn ich diese Leitung abnehme (oder sie kommentiere), wird der Paketempfang viel schneller sein.
Wie kann ich dieses Problem möglicherweise lösen? Ich denke, mehr Threads ist der Schlüssel, aber ich bin mir nicht sicher, wie man sie in dieser Situation richtig implementiert ... Ich verwende Windows Forms mit .NET 2.0.
EDIT:
Auf meinem vorherigen Test scheinen die oben wahr zu sein, und es kann zu einem gewissen Grad tatsächlich. Aber nach ein bisschen mehr Tests realisierte ich, dass das Problem insgesamt Invoke(new MethodInvoker(() => { ... }));
Sache war. Wenn ich das entferne (die Benutzeroberfläche wird natürlich nicht aktualisiert werden) und EVENTHANDLER_UpdateTransferProgress
lassen, aber das Ereignis weiter erhöhen, ist der Paketempfang viel schneller.
Ich testete den Empfang einiger Dateien, die im Durchschnitt etwa ~ 1,5 Sekunden ohne Aufruf von Invoke()
auf dem Event-Handler nahmen. Wenn ich im Event-Handler Invoke()
aufgerufen habe, sogar ohne ein Steuerelement in der Benutzeroberfläche zu aktualisieren oder eine Operation auszuführen (mit anderen Worten, der anonyme Methodenkörper war leer), dauerte es viel länger, etwa ~ 5,5 Sekunden. Sie können sehen, es ist ein großer Unterschied.
Gibt es trotzdem etwas zu verbessern?
Welche Version von .NET verwenden Sie? –
@SeanThoman Für diese spezifische Anwendung .NET 2.0. –
Siehe diesen Thread - http://stackoverflow.com/questions/661561/how-to-update-gui-from-another-thread-in-c –