次の例を考えてみましょう
public class ChildViewModel
{
public BackgroundWorker BackgroundWorker;
public ChildViewModel()
{
InitializeBackgroundWorker();
BackgroundWorker.RunWorkerAsync();
}
private void InitializeBackgroundWorker()
{
BackgroundWorker = new BackgroundWorker();
BackgroundWorker.DoWork += backgroundWorker_DoWork;
BackgroundWorker.RunWorkerCompleted +=backgroundWorker_RunWorkerCompleted;
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//do something
}
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
//do time consuming task
Thread.Sleep(5000);
}
public void UnregisterEventHandlers()
{
BackgroundWorker.DoWork -= backgroundWorker_DoWork;
BackgroundWorker.RunWorkerCompleted -= backgroundWorker_RunWorkerCompleted;
}
}
public class ParentViewModel
{
ChildViewModel childViewModel;
public ParentViewModel()
{
childViewModel = new ChildViewModel();
Thread.Sleep(10000);
childViewModel = null;
//would the childViewModel now be eligible for garbage collection at this point or would I need to unregister the background worker event handlers by calling UnregisterEventHandlers?
}
}
質問:ガベージコレクションの対象となるには、childViewModelオブジェクトのバックグラウンドワーカーイベントハンドラーの登録を解除する必要がありますか?(これは単なる例です。バックグラウンドワーカーを必要とせずにこの状況でTPLを使用できることは承知していますが、この特定のシナリオに興味があります。)