私のコンソールアプリはSystem.ComponentModel.BackgroundWorker
スレッド化の目的で使用します:
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);
ご覧のとおり、RunWorkerAsync内で引数として「worker」を渡しています。
私が達成しようとしているのは、ReportStatusメソッド内に例外がある場合、何らかの操作を実行できるように同じ「ワーカー」オブジェクトが必要なことです(サービスを呼び出してそのワーカーの例外を通知します)
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;
}
}
私の例外ブロックでは(これが正しい方法かどうかはわかりません!)RunWorkerCompletedメソッド(backgroundWorker1_RunWorkerCompleted)が実行されたときに同じワーカーを取り戻すことができるように、ワーカーをResultに割り当てています:
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!
}
}