Antwort

0

Abhängig von Ihrem Modell möchten Sie entweder Ihren Worker-Thread zum Ersteller (oder zu einem anderen Prozess) zurückrufen, wenn er seine Arbeit beendet hat, oder Sie müssen den Worker-Thread ab und zu abfragen, um zu sehen, ob er vorhanden ist getan und wenn ja, bekomme das Ergebnis.

Die Idee, darauf zu warten, dass ein Worker-Thread sein Ergebnis zurückgibt, untergräbt die Vorteile von Multithreading.

1

RunWorkerAsync() startet den Prozess asynchron und wird Ihren Code zurückgeben und weiter ausführen, bevor der Prozess tatsächlich abgeschlossen wird. Wenn Sie das Ergebnis der BackgroundWorker erhalten möchten, müssen Sie eine Instanzvariable erstellen, um diesen Wert zu speichern, und es überprüfen, sobald die BackgroundWorker abgeschlossen ist. Wenn Sie warten möchten, bis die Arbeit beendet ist, brauchen Sie keine BackgroundWorker.

+1

Es gibt einen Unterschied zwischen Warten und die UI_ _locking, während dies zu tun. –

+0

@TSar: Das stimmt, obwohl im Zusammenhang mit der Arbeit mit einer älteren Komponente wie 'BackgroundWorker' die Semantik des" Wartens "relativ komplex ist (oder zumindest zu demonstrieren, wie es" wartet "). So etwas ist viel einfacher, mit 'async' auszudrücken und' await' Syntax jetzt und würde es dem Entwickler zu tun, weg mit den meisten Anwendungsfälle für 'BackgroundWorker' zusammen. –

+0

Dann wäre es schön, deine Antwort mit den Alternativen zu ergänzen, anstatt nur die OP sagt nicht die Background zu verwenden. Wie es jetzt liest, scheint es Sie behaupten nicht, überhaupt jede Art von Multi-Threading verwendet - und das würde Verriegeln den App am Ende, bis der Vorgang beendet ist. –

1

Sie Ihren Thread mit dem Objekt als Argument ein Ereignis auslösen haben könnte:

ThreadFinishedEvent(this, new ThreadEventArgs(object)); 

Wo:

public class ThreadEventArgs : EventArgs 
{ 
    public ThreadEventArgs(object object) 
    { 
     Object = object 
    } 

    public object Object 
    { 
     get; private set; 
    } 
} 
18

Ich gehe davon aus, dass Sie nicht auf blockieren und warten wollen RunWorkerAsync() für die Ergebnisse (wenn Sie dies getan hätten, gäbe es keinen Grund, async auszuführen!)

Wenn Sie benachrichtigt werden möchten, wenn der Hintergrundprozess abgeschlossen ist, haken Sie das RunWorkerCompleted-Ereignis Wenn Sie einen Status zurückgeben möchten, geben Sie ihn im Ergebniselement von DoWorks Ereignisarg zurück.

EDIT: Ich stellte vorzeitig - fertig mein Codebeispiel

Beispiel:

 


    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     // do your thing 
     .... 
     // return results 
     e.Result = theResultObject; 
    } 

    // now get your results 
    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     MyResultObject result = (MyResultObject)e.Result; 
     // process your result... 
    } 

 
87

In Ihrem DoWork Ereignishandler für die BackgroundWorker (das ist, wo die Hintergrundarbeit stattfindet) gibt es ein Argument DoWorkEventArgs. Dieses Objekt hat ein öffentliches Eigenschaftsobjekt Result. Wenn Ihr Mitarbeiter das Ergebnis generiert hat (in Ihrem Fall eine List<FileInfo>), setzen Sie e.Result darauf und kehren Sie zurück.

Nun, da Ihr BackgroundWorker seine Aufgabe abgeschlossen hat, wird das Ereignis RunWorkerCompleted ausgelöst, das ein -Objekt als Argument enthält. RunWorkerCompletedEventArgs.Result enthält das Ergebnis Ihrer BackgroundWorker.

Beispiel:

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    int result = 2+2; 
    e.Result = result; 
} 

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    int result = (int)e.Result; 
    MessageBox.Show("Result received: " + result.ToString()); 
} 
+0

Bahhh danke! – ganjeii

0

Allgemein gesprochen, wenn ein Prozess async läuft, sollte der Arbeiter-Thread einen Delegierten Anruf oder ein Ereignis ausgelöst (wie ChrisF).

Sie können den neuen PFX auschecken, der über eine Nebenläufigkeitsfunktion verfügt, die Werte zurückgeben kann.

Zum Beispiel gibt es eine Funktion namens Parallel.ForEach(), die eine Überladung hat, die einen Wert zurückgeben kann.

diese Prüfung für weitere Informationen aus

http://msdn.microsoft.com/en-us/magazine/cc817396.aspx

Verwandte Themen