包含永不停止任务的对象是否会被垃圾收集?

时间:2016-07-01 12:36:50

标签: c# wpf garbage-collection task-parallel-library

我有以下简单类:

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);
        }
    }
}

此类的实例是否会被垃圾收集?或者无限运行任务的存在会阻止垃圾收集吗?

2 个答案:

答案 0 :(得分:1)

这不会是GC,因为任务总是扎根。

  1. 如果它在延迟内部,则存在一个隐藏的Timer实例,它本身就是一个根。生根链是这样的:计时器 - >回调 - >异步状态机 - > TaskCompletionSource - >任务。
  2. 如果它当前正在执行它运行的线程是根。
  3. 这不是一般化的。例如,await new TCS().Task; 成为GC。没有根。

答案 1 :(得分:0)

不,我不认为它可以被垃圾收集。

垃圾收集器将通知对象释放内存直到除非它们未被使用的原因。 因为如果对象经常成为任务的一部分并且在使用中非常有用,则该对象无法释放。