处置任务会发生什么?

nic*_*ojs 5 c# idisposable task 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.
}
Run Code Online (Sandbox Code Playgroud)

DoWork会在这个例子中完成吗?即使垃圾收集器决定处理Task实例变量t?

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

Rus*_*est 10

是的,它会运行.如果你反编译代码,你可以看到呼叫Task.Factory.StartNew通话Task.InternalStartNew,它调用Task.ScheduleAndStart(false).

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