[英]What happens to Tasks that are never completed? Are they properly disposed?
[英]What happens to a disposed Task?
当本地任务引用超出范围并且垃圾收集器决定在任务完成之前解除它时会发生什么?
基本上我在问这种服务调用实现是否安全:
/// <summary>
/// Web service operation to start a large batch asynchronously
/// </summary>
public StartBatchResponseMessage StartBatch(StartBatchRequestMessage request)
{
Task t = Task.Factory.StartNew(DoWork);
return new StartBatchResponseMessage();
}
private void DoWork()
{
// Implement solving world hunger here.
}
DoWork会在这个例子中完成吗? 即使垃圾收集器决定处理Task实例变量t?
如果没有,实现这种功能的更安全的方法是什么?
是的,它会运行。 如果您反编译代码,您可以看到对Task.Factory.StartNew
调用调用Task.InternalStartNew
,它调用Task.ScheduleAndStart(false)
。
这反过来调用task.m_taskScheduler.QueueTask(this),
根据MSDN,它将任务添加到内部结构 - 这当然会阻止它被垃圾收集。 这正如你所希望的那样。
常识,你知道。 任务库必须以某种方式调用您的方法,因此 - 它必须保留引用,否则它无法调用它。 所以,显然,这个引用可以防止垃圾回收。
基本上你得到的“任务”是指向内部执行引擎也必须引用的Task对象的指针,否则它永远不会被执行。
因此,因为有参考OTHER而不是你的t变量,所以它不会被处理。
是的,任务将始终完成。 在任务运行时,垃圾收集器不会访问其相关部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.