delgatesをパラメータとして渡してイベントの登録を解除しようとしているときに、それらをアンフックする関数が正確にアンフックされていません。Windowsのbackgroundworkerのイベントをアンフックできませんフォーム(C#)
public void registerHandlers(RunWorkerCompleted backgroundWorker1_RunWorkerCompleted, DoWork backgroundWorker1_dowork, ProgressChanged backgroundWorker1_ProgressChanged)
{
this.backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
this.backgroundWorker1.DoWork += backgroundWorker1_dowork;
this.backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
}
public void unregisterHandlers(RunWorkerCompleted backgroundWorker1_RunWorkerCompleted, DoWork backgroundWorker1_dowork, ProgressChanged backgroundWorker1_ProgressChanged)
{
this.backgroundWorker1.RunWorkerCompleted -= backgroundWorker1_RunWorkerCompleted;
this.backgroundWorker1.DoWork -= backgroundWorker1_dowork;
this.backgroundWorker1.ProgressChanged -= backgroundWorker1_ProgressChanged;
}
private void buuton1_click(object sender, EventArgs e)
{
registerHandlers(this.worker1_RunWorkerCompleted, this.worker1_doWork, this.worker1_progressChangedHandler);
this.backgroundWorker1.RunWorkerAsync();
}
private void buuton2_click(object sender, EventArgs e)
{
registerHandlers(this.worker2_RunWorkerCompleted, this.worker2_doWork, this.worker2_progressChangedHandler);
this.backgroundWorker1.RunWorkerAsync();
}
// ..
private void worker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
// ...
}
catch(Exception e)
{
// ..
}
finally
{
unregisterHandlers(this.worker1_RunWorkerCompleted, this.worker1_doWork, this.worker1_progressChangedHandler);
}
}
私はバックグラウンドワーカーを処分しておらず、イベントハンドラを登録および登録解除してコンポーネントを再利用しています。 – user186246