本地任务引用超出范围时会发生什么,垃圾收集器决定在任务完成之前删除它?
基本上我在问这种服务调用实现是否安全:
/// <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?
如果没有,实现这种功能的更安全的方法是什么?
答案 0 :(得分:10)
Task.Factory.StartNew
来电Task.InternalStartNew
的来电,呼叫Task.ScheduleAndStart(false)
。
这反过来调用task.m_taskScheduler.QueueTask(this),
根据MSDN将任务添加到内部结构 - 这当然会阻止它被垃圾收集。这正如你所希望的那样。
答案 1 :(得分:3)
常识,你知道。任务库必须以某种方式调用您的方法,因此 - 它必须保留引用,否则它无法调用它。所以,显然,这个引用可以防止垃圾回收。
基本上,你得到的“任务”是指向内部执行引擎也必须引用的Task对象的指针,否则它永远不会被执行。
因此,由于存在除了你的t变量之外的引用,所以它不会被处理掉。
答案 2 :(得分:1)
是的,任务将始终完成。在任务运行时,垃圾收集器不会访问其相关部分。