我有以下简单类:
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,因为任务总是扎根。
Timer
实例,它本身就是一个根。生根链是这样的:计时器 - >回调 - >异步状态机 - > TaskCompletionSource - >任务。这不是一般化的。例如,await new TCS().Task;
将成为GC。没有根。
答案 1 :(得分:0)
不,我不认为它可以被垃圾收集。
垃圾收集器将通知对象释放内存直到除非它们未被使用的原因。 因为如果对象经常成为任务的一部分并且在使用中非常有用,则该对象无法释放。