Übergeben von benutzerdefinierten Objekts RunWorkerCompleted-Ereignis im Fall einer Ausnahme
Meiner Console App verwendet System.ComponentModel.BackgroundWorker
für Gewinde für Zwecke:
System.ComponentModel.BackgroundWorker backgroundWorker = new System.ComponentModel.BackgroundWorker();
backgroundWorker.DoWork += (sender, e) =>
ReportStatus(worker, status, result, e);
backgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker.RunWorkerAsync(worker);
Wie Sie sehen können, dass ich mich übergeben "Arbeiter" als argument innerhalb runworkerasync erfasst.
Was ich erreichen will ist, dass wenn es eine Ausnahme innerhalb ReportStatus-Methode brauche ich den selben "Mitarbeiter" - Objekt so, dass ich durchführen kann, eine operation (einen Dienst Aufrufen zu Benachrichtigen, dass der Arbeitnehmer die Ausnahme)
private void ReportStatus(Worker worker, Status status, WorkResult result,System.ComponentModel.DoWorkEventArgs arg)
{
var proxy = new PreparationServiceProxy(new NetTcpBinding(), new EndpointAddress(PreparationEngineState.ServiceAddress));
try
{
proxy.ReportStatus(worker, status, result);
proxy.Close();
}
catch (Exception)
{
arg.Result = worker;
proxy.Abort();
throw;
}
}
In meiner exception-block (ich bin nicht sicher, ob dies der richtige Weg!) Ich bin die Zuordnung der Arbeitnehmer zu dem Ergebnis so dass ich bekommen kann die gleichen Arbeiter zurück, wenn das RunWorkerCompleted-Methode (backgroundWorker1_RunWorkerCompleted) ist ausgeführt :
private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
Worker worker = e.Result as Worker; //At this point I get an exception!
}
}
- welche Ausnahme machen Sie?
- Also, was ist deine Frage??
- Sorry wenn ich nicht klar war, aber die grundlegende Frage ist, dass im Innern "backgroundWorker1_RunWorkerCompleted" ich bekomme eine exception wenn ich versuche zu konvertieren mein argument zurück auf das worker-Objekt:
- Da bin ich auslösen der Ausnahme (für die it-Blase bis zu backgroundWorker1_RunWorkerCompleted) , die exception die ich bekomme, ist : "Eine Ausnahme ist aufgetreten während der operation, so dass das Ergebnis ungültig. Check exception InnerException details."
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist, weil Sie re-warf die Ausnahme.
BackgroundWorker
sieht, dass da eine unbehandelte Ausnahme durch dieDoWork
handler und wieder wirft es wieder auf den anderen thread, wenn man dasResult
Wert.Wenn Sie nicht wollen, es zu tun, entfernen Sie die
throw
in Ihren Fang in dieDoWork
hf.wenn Sie übergeben das worker-Objekt in der
BackgroundWorker
, warum nicht verwenden, verwenden Sie einfach, was Sie übergeben in einem exception-handler einwickeln der AufrufResult
oder in dem block, testsError
? z.B.:BackgroundWorker
. Die Art und Weise, die Sie beschrieben haben "der Arbeiter" es ist nicht ein "Resultat" und scheint fehl am Platz, wenn verwendet, inResult
. Ich würde nur code Fehler in der form-Klasse und beschäftigen sich mit der Arbeiter dort..NET ist NICHT der Auffassung, dass die Async-Betrieb könnte sich ergeben, wenn ein Fehler passiert ist. Das ist, warum Sie haben werden, übergeben Sie es einen anderen Weg.
Ich würde empfehlen, zu implementieren benutzerdefinierte exception-Klasse:
Und wickeln Sie die Ausnahme entsprechend:
In diesem Fall werden Sie in der Lage, abrufen Arbeitnehmer der Ausnahme, casting-Fehler zu WorkerException:
Den
RunWorkerCompletedEventArgs
enthält eineUserState
Eigenschaft, die (glaube ich) sollte einen Verweis auf das gleiche Objekt, das Sie übergeben, um dieRunWorkerAsync
Methode. (Es sollte auch in derDoWorkEventArgs
alsArgument
Eigenschaft.)Müssen Sie Experimentieren, um zu bestätigen, dass diese
UserState
ist das richtige Objekt (Darsteller esas Worker
) und es ist gültig, auch wenn dieDoWork
handler hat eine Ausnahme, aber ich denke, das könnte sein, was du bist suchen für.