Ich muss RunWorkerAsync()
eine List<FileInfo>
zurückgeben. Wie kann ich ein Objekt von einem Hintergrundarbeiter zurückgeben?Wie man BackgroundWorker ein Objekt zurückgeben
Antwort
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.
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
.
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;
}
}
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...
}
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());
}
Bahhh danke! – ganjeii
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
- 1. Wie fügt man ein BackgroundWorker RunWorkerCompleted-Ereignis durch Reflektion hinzu?
- 2. Wie warten, bis ein BackgroundWorker abbricht?
- 3. Wie verwendet man das BackgroundWorker-Ereignis RunWorkerCompleted
- 4. PHP-Objekt zurückgeben Verschiedenes Objekt
- 5. Warum würde mysqli_fetch_assoc ein leeres Objekt zurückgeben?
- 6. django rest framework ein benutzerdefiniertes Objekt zurückgeben
- 7. Wie schneidet man ein JavaScript-Objekt?
- 8. Wie kann ich ein Objekt eines beliebigen Typs zurückgeben?
- 9. Wie konvertiert man ein Timedelta-Objekt in ein Datetime-Objekt
- 10. Wie konvertiert man ein jQuery-Objekt in ein d3-Objekt?
- 11. WPF und backgroundworker Problem
- 12. Wie kann man ein XHR "promisable" machen und trotzdem das XHR-Objekt zurückgeben?
- 13. Objekt-Tags als Liste zurückgeben
- 14. BackgroundWorker langsam
- 15. BackgroundWorker mit anonymen Methoden?
- 16. Javascript Standard-Objekt - Wie zwei Elemente zurückgeben?
- 17. Wie man ein Objekt aus NSDictionary entfernt
- 18. Wie erstellt man ein Objekt in MongoDB
- 19. Wie gibt man ein Objekt aus?
- 20. Wie verschiebt man ein Objekt in Three.js?
- 21. Wie serialisiert man ein Objekt in C++?
- 22. C# Wie man ein Objekt niederdrückt
- 23. Wie verschlüsselt man ein JSON-Objekt kryptographisch?
- 24. Wie erstellt man ein WMI-Objekt?
- 25. Django Formset - Wie aktualisiert man ein Objekt?
- 26. Wie klont man ein Objekt in Android?
- 27. Wie man ein Java-Objekt downcast?
- 28. Wie instanziert man ein Objekt in Java?
- 29. Wie man durch ein Javascript-Objekt iteriert?
- 30. Wie erstellt man ein benutzerdefiniertes fabricjs Objekt?
Es gibt einen Unterschied zwischen Warten und die UI_ _locking, während dies zu tun. –
@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. –
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. –