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

本文关键字:永无止境 任务 对象 是否 包含 | 更新日期: 2023-09-27 17:53:41

我有以下简单的类:

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

这个类的实例会被垃圾收集吗?还是存在无限运行的任务会阻塞垃圾收集?

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

由于任务始终处于根状态,因此不会被GC检查。

  1. 如果它在延迟内部,则存在一个隐藏的Timer实例,其本身就是根。根链如下:timer -> callback -> async状态机-> TaskCompletionSource -> Task。
  2. 如果当前运行的线程是根线程。

这是不可推广的。例如,await new TCS().Task; 将被GC'ed。

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

垃圾收集器将通知对象从内存中释放的原因,除非它们不被使用。因为如果对象经常是任务的一部分并且经常被使用,则该对象不能被释放。