c# - 包含永无止境任务的对象会被垃圾回收吗?

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

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

最佳答案

这不会被 GC 处理,因为任务总是根目录。

  1. 如果它在延迟内部,则存在一个隐藏的 Timer 实例,它本身就是一个根。根链是这样的:计时器 -> 回调 -> 异步状态机 -> TaskCompletionSource -> 任务。
  2. 如果它当前正在执行它运行的线程是根。

这不是一概而论的。例如,await new TCS().Task; 进行 GC。没有根。

关于c# - 包含永无止境任务的对象会被垃圾回收吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38145621/

相关文章:

c# - 删除 Entity Framework 中的所有实体

c# - 在 Viewmodel 属性中防止 StackOverFlow 或递归

WPF TextBox不会更新源

c# - 可以将 DirectX 表面绘制到 WPF 控件吗?

c# - 如何刷新/重新加载桌面

关于清除链表的 Java 最佳实践

c# - 有没有办法显示 "blocking"WinForms 上下文菜单?

c# - SignalR 将数据服务器推送到客户端

c# - 使用 c 可执行文件中的 C# 库 (dll) 类卡在 GSHandle 上 (^)

c# - 更新另一个页面上的控件 Windows 8 Metro 应用程序 C#