考虑到我有一个简单的类,我只想初始化它(或者在对象的生命周期中执行一些任务)。考虑到 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 不使用引用计数。每个垃圾收集操作都会发现实例。
如果您的问题是“太多引用会损害 GC 性能?”,答案是“可能”。但你需要测量一下才能确定。
您期望代码的结果是什么?它只是将已完成的任务分配给将完成分配的任务的字段。
如果您只是为了此 hack 的目的而添加
WaitUntilInitialized
字段,那么您就会增加类的大小以及 GC 必须检查可达性的实例数量。
如果您正在使用该字段,则调用代码很可能已经获取了对
Task
返回的 Task.Run
的引用。