处置任务会发生什么?

时间:2011-12-16 11:45:15

标签: c# task idisposable task-parallel-library

本地任务引用超出范围时会发生什么,垃圾收集器决定在任务完成之前删除它?

基本上我在问这种服务调用实现是否安全:

/// <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?

如果没有,实现这种功能的更安全的方法是什么?

3 个答案:

答案 0 :(得分:10)

是的,它会被运行。如果您对代码进行反编译,则可以看到Task.Factory.StartNew来电Task.InternalStartNew的来电,呼叫Task.ScheduleAndStart(false)

这反过来调用task.m_taskScheduler.QueueTask(this),根据MSDN将任务添加到内部结构 - 这当然会阻止它被垃圾收集。这正如你所希望的那样。

答案 1 :(得分:3)

常识,你知道。任务库必须以某种方式调用您的方法,因此 - 它必须保留引用,否则它无法调用它。所以,显然,这个引用可以防止垃圾回收。

基本上,你得到的“任务”是指向内部执行引擎也必须引用的Task对象的指针,否则它永远不会被执行。

因此,由于存在除了你的t变量之外的引用,所以它不会被处理掉。

答案 2 :(得分:1)

是的,任务将始终完成。在任务运行时,垃圾收集器不会访问其相关部分。

相关问题