将 Task 引用更改为 Task.CompletedTask 在 GC 和引用计数的上下文中是否有意义?

问题描述 投票:0回答:1

考虑到我有一个简单的类,我只想初始化它(或者在对象的生命周期中执行一些任务)。考虑到 GC,在完成所有操作后将引用切换到 Task.Completed 是否会改变任何内容?

    public class EmployeesAtPremisesAfterWork
    {

        private ConcurrentHashSet<int> isAtPremisesAfterWork = new ConcurrentHashSet<int>();
        public Task WaitUntilInitialized;

        public EmployeesAtPremisesAfterWork(SomeInitializationHelper helper)
        {
            WaitUntilInitialized = Task.Run(async () =>
            {
                var attachedValues = await helper.GetEmployeeAttachedValues();

                isAtPremisesAfterWork.AddRange(attachedValues.AtPremisesAfterWork);

                WaitUntilInitialized = Task.CompletedTask;
            });
        }
    }

我只是好奇,因为我仍然不太确定 GC 相关的事情。 Task 完成后是否保留对其上下文的引用,还是释放它?

.net async-await garbage-collection
1个回答
0
投票

.NET 不使用引用计数。每个垃圾收集操作都会发现实例。

如果您的问题是“太多引用会损害 GC 性能?”,答案是“可能”。但你需要测量一下才能确定。

您期望代码的结果是什么?它只是将已完成的任务分配给将完成分配的任务的字段。

如果您只是为了此 hack 的目的而添加

WaitUntilInitialized
字段,那么您就会增加类的大小以及 GC 必须检查可达性的实例数量。

如果您正在使用该字段,则调用代码很可能已经获取了对

Task
返回的
Task.Run
的引用。

© www.soinside.com 2019 - 2024. All rights reserved.