0

次の例を考えてみましょう

  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を使用できることは承知していますが、この特定のシナリオに興味があります。)

4

1 に答える 1

2

それはあなたのバックグラウンドワーカーが公開されている理由に少し依存します。ただし、ViewModelクラスがバックグラウンドワーカーへの強い参照を保持している唯一のクラスであり、バックグラウンドワーカーが(2つのイベントを介して)ビューモデルへのハード参照を保持している場合、ビューモデルがない場合、両方がガベージコレクションとしてマークされますもう参照によって保持します。

いくつかの詳細を含む同様の質問。

于 2013-01-18T02:30:26.950 に答える