HI全て。 Workerクラスのインスタンスを実行するBackgroundWorkerオブジェクトの配列があります。 Workerクラスを呼び出すと、オブジェクトインスタンスはそれを行い、コードがなくなります(ループが終了します)。私はRunWorkerCompleted()イベントを聞くことができますが、私が設定したデリゲートを呼び出すときに、完了したWorkerオブジェクトを知る必要があります。RunWorkerCompletedEventArgsオブジェクトでUserStateをどのように設定しますか?
私の代理人になるRunWorkerCompletedEventArgsのUserStateプロパティが表示されますが、終了時にWorkerオブジェクトにこれを設定する方法はわかりません。
アイデア?その私のWorkManager.csクラスから
スニペット
public Worker AddWorker()
{
Worker w = new Worker();
_workers.Add(w.WorkerID,w);
BackgroundWorker bg = new BackgroundWorker();
_bgworkers.Add(bg);
bg.DoWork += w.Start;
bg.WorkerReportsProgress = true;
bg.WorkerSupportsCancellation = true;
bg.ProgressChanged += ProcessWorkerMessage;
bg.RunWorkerCompleted += WorkerFinished;
w.WorkManager = this;
w.BackgroundWorker = bg;
bg.RunWorkerAsync(w);
return w;
}
public void WorkerFinished(object sender, RunWorkerCompletedEventArgs e)
{
if (_onManagerEvent != null)
_onManagerEvent(new ManagerEvent { EventDate = DateTime.Now, Message = "Worker ??? successfully ended." });
}
私のワーカーオブジェクトがそのスタート()メソッドでループを終了したときに、私はRunWorkerCompleteEventArgsオブジェクトのuserStateプロパティを埋めるために何をしますか「E」 WorkerFinishedメソッド()に渡されますか?
おかげ
トリックをやったおかげでフィリップ、。 e.Cancelledを常にチェックするというあなたのコメントが重要でした。実際には、BackgroundWorkerオブジェクトのCancelAsync()メソッドを呼び出すことによってワーカースレッドを停止していました。これは、RunWorkercompletedEventArgs Resultプロパティに元のオブジェクトが存在しない原因となりました。私は、ワーカーオブジェクトのプロパティをスレッドセーフな方法で設定し、ワーカーのコードループでそのプロパティをチェックすることによって、ワーカーを停止するようにリファクタリングしました。私がループとボイラを終了する信号を見ると、RunWorkercompletedEventArgs argは自分のオブジェクトをe.Resultに持っています。 – sisdog