包含永无止境的任务的对象是否会被垃圾收集?
本文关键字:永无止境 任务 对象 是否 包含 | 更新日期: 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检查。
- 如果它在延迟内部,则存在一个隐藏的
Timer
实例,其本身就是根。根链如下:timer -> callback -> async状态机-> TaskCompletionSource -> Task。 - 如果当前运行的线程是根线程。
这是不可推广的。例如,await new TCS().Task;
将被GC'ed。
不,我认为它不能被垃圾收集。
垃圾收集器将通知对象从内存中释放的原因,除非它们不被使用。因为如果对象经常是任务的一部分并且经常被使用,则该对象不能被释放。