2016-06-01 4 views
0

Ich verwende einen Hintergrund-Worker für eine Anwendung, um eine Fortschrittsanzeige auf der Benutzeroberfläche zu aktualisieren. Ich kann den Fortschritt unter Verwendung des Folgenden melden.Wie kann ich Argumente (Zeichenfolge) an den UI-Thread mit dem Background Worker senden?

backgroundWorker.ReportProgress(barProgress); 

Das Problem ist, dass der Report Methode nur eine Ganzzahl als Parameter nimmt, aber ich brauche auch eine Zeichenfolge passieren ein Etikett auf dem Fortschrittsbalken zu aktualisieren.

progressLabel.Text = "Passed Argument";   
progressLabel.Refresh(); 

Ich kann nicht scheinen, eine Methode zu finden, um es direkt auf dem BackgroundWorker-Objekt zu übergeben. Gibt es irgendeine Methode, die ich nicht sehe oder eine Möglichkeit, dies zu tun?

+5

'ReportProgress' hat einen zweiten optionalen Parameter, die ein Objekt nimmt - Dieses Objekt ist alles, was du willst. Vom ProgressChanged-Ereignis würden Sie das UserState-Objekt anhand des ProgressChangedEventArgs-Parameters untersuchen. – LarsTech

+0

@LarsTech Das wäre eine sehr gute Antwort und besser als die derzeit angebotene. –

+0

@LarsTech Ich hatte diese Überlastung gesehen, aber ich dachte, es wäre etwas anderes. Vielen Dank. –

Antwort

2

Das Problem ist, dass die Reportverfahren dauert nur eine Ganzzahl als Parameter

Eigentlich gibt es eine andere Methode ReportProgressoverload die Sie zusätzliche beliebiges Objekt passieren lässt, die dann über ProgressChangedEventArgs.UserState Eigenschaft zugänglich ist.

Zum Beispiel:

backgroundWorker.ReportProgress(barProgress, "Passed Argument"); 

und dann im Innern der ProgressChanged Veranstaltung:

progressLabel.Text = e.UserState as string;   
progressLabel.Refresh(); 
0

Ja, Sie können nur die aufrufen, die mit dieser Steuerung verbunden ist.

Dispatcher.BeginInvoke(new Action(()=>{ 
    progressLabel.Text = "Passed Argument";   
    progressLabel.Refresh(); 
}); 

Die Benutzeroberfläche läuft in einem Einzel Thread Apartment (STA) und in der Regel nicht Kreuz Thread-Zugriffe (Sie einen CrossThreadException bekommen könnte, wenn Sie dies vorher versucht) erlaubt. Mit dem Aufruf der erzählst du es im Grunde, was ausgeführt werden soll, wenn der UI-Thread wiederum an der Verarbeitung ist.

Nur stellen Sie sicher, dass Sie Dispatcher.Invoke nicht aus dem UI-Thread selbst aufrufen, das wäre Deadlock. Wenn Sie über Methoden verfügen, die entweder von Ihrer Benutzeroberfläche oder einem anderen Thread aufgerufen werden können, können Sie überprüfen, ob Sie derzeit über eine ausgeblendete Methode (keine Autovervollständigung oder IntelliSense) mit der Bezeichnung verfügen, die true zurückgibt, wenn Sie direkt auf dieses Steuerelement zugreifen können oder false Sie müssen den Dispatcher verwenden.

1

Es gibt ein overload of ReportProgress, die einen userstate Parameter hat. Dies vom Typ object, so kann es alles sein, was Sie möchten.

nennen es also von Ihrem DoWork Handler wie folgt:

backgroundWorker.ReportProgress(barProgress, "Passed Argument"); 

und greifen Sie in Ihrem ProgressChanged Handler wie folgt:

progressLabel.Text = (string)e.UserState;   
progressLabel.Refresh(); 
Verwandte Themen