Backgroundworker das RunWorkerCompleted-Ereignis ausgelöst noch vor Abschluss der arbeiten
Ich bin mit dem BackgroundWorker thread eine lange Aufgabe ausführen(im Grunde das Lesen eine große xml-Datei). Für die erste Zeit, die der Arbeiter arbeitet fein wie gewünscht, aber wenn ich hochladen eine zweite xml-Datei, mit dem gleichen hintergrund-worker funktioniert es manchmal, aber die meiste Zeit der Backgroundworker ist RunWorkerCompleted ausgelöst wird, noch bevor der DoWork-Ereignis. Einige der code, der unten angezeigt wird
private void openFile_Click(object sender, RoutedEventArgs e)
{
//Code removed for brevity
worker = new BackgroundWorker();
worker.RunWorkerAsync();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.WorkerReportsProgress = true;
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DataImport();
//worker.Dispose();
//worker.Disposed += new EventHandler(worker_Disposed);
//worker.DoWork -= worker_DoWork;
//worker.RunWorkerCompleted -= worker_RunWorkerCompleted;
//worker = null;
//GC.Collect(GC.GetGeneration(worker), GCCollectionMode.Forced);
}
Arbeitnehmer ist eine Global definierte variable. Was ist hier falsch bin ich nicht immer. Bitte helfen
- Ein paar Tipps zum Abschluss: Don ' T call
GC.Collect()
, Tun, überprüfene.Error
. - Nicht zu beantworten, w/o zu sehen, mindestens eine Kontur in der DoWork().
- Wenn Ihr DoWork-Funktion erstellt einen thread für die Durchführung Ihrer Arbeit, und Sie nicht .Join(), DoWork wird schlagartig wieder. Aber wie @Henk sagte, müssen sehen, was DoWork tut.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie die
DoWork
-event-handler (und alle anderen event-handler, die auch vor aufrufenRunWorkerAsync()
.Ansonsten könnte es passieren, dass
RunWorkerAsync
macht praktisch nichts.RunWorkerCompleted
Ereignis, das ausgelöst wird, gehört nicht zu den "aktuellen" hintergrund-Arbeiter.Es sollte wie folgt sein:
RunWorkerAsync
sollte aufgerufen werden, nachdem die Anmeldung auf derDoWork
undRunWokerCompleted
Veranstaltungen.sollten Sie zuerst überprüfen, dass der hintergrund Arbeiter beschäftigt ist oder nicht, mit dieser....
Wie gesagt in https://stackoverflow.com/a/16809596/8029935, können Sie blind werden, vorausgesetzt, dass der worker beendet den job und produziert ein Ergebnis, wenn die DoWork-Methode stirbt eine Ausnahme. Die ist gefangen von der BackgroundWorker-Klasse, und übergeben Sie das RunWorkerCompleted-Ereignis-handler als e.Error-Eigenschaft.
So, ich schlage vor, Sie müssen überprüfen, dass die Eigenschaft über einen try/catch-Anweisung.