2016-07-01 6 views
3

私は、次の単純なクラスを持っている:終わりのないタスクを含むオブジェクトはガベージコレクションされますか?

public sealed class TimeStampTestViewModel : ObservableObject 
{ 
    private CancellationTokenSource cancellationSource; 

    public TimeStampTestViewModel() 
    { 
     this.cancellationSource = new CancellationTokenSource(); 
     PeriodicTimeStampChanged(cancellationSource.Token); 
    } 

    public string TimeStamp 
    { 
     get 
     { 
      return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); 
     } 
    } 

    private async void PeriodicTimeStampChanged(CancellationToken token) 
    { 
     while (!token.IsCancellationRequested) 
     { 
      RaisePropertyChanged("TimeStamp"); 
      await Task.Delay(500, token); 
     } 
    } 
} 

は、このクラスのインスタンスは、これまでゴミが収集されますか?または、無限実行中のタスクブロックのガベージコレクションの存在がありますか?

+0

未確認の回答を確認してください。それはかなり良い説明があります –

答えて

1

タスクは常にルートされているため、これはGCされません。

  1. 遅延の内部にある場合は、それ自身がルートである隠しファイルTimerがあります。ルーティンチェインは、タイマー→コールバック→非同期状態マシン→TaskCompletionSource→Taskのようになります。
  2. 現在実行中のスレッドは、実行されているスレッドがルートです。

これは一般化できません。例えば、await new TCS().Task;でGCされる。ルートはありません。

0

いいえ、ガベージコレクションできないと思います。

ガベージコレクタがオブジェクトがメモリから解放されるまで、またそれらが使用されていない場合を除いて、オブジェクトに通知するという理由があります。 オブジェクトが定期的にタスクの一部であり、reqularly useである場合、オブジェクトは解放できません。

関連する問題