使用TaskCompletionSource的TaskCreationOptions的目的是什么?

uzu*_*zul 12 c# task-parallel-library taskcompletionsource

对于我的内心运作方式,我有些不清楚TaskCompletionSource<>.

Task<>使用the 创建一个简单的时候Factory,我希望这个任务在一个线程池中排队,除非我指定TaskCreationOptions.LongRunning,它将在一个新的线程中运行.

我的理解TaskCompletionSource是,我负责在任务结束或失败时触发,并且我完全控制如何管理线程.然而,ctor TaskCompletionSource允许我指定一个TaskCreationOptions,这让我感到困惑,因为我期望Scheduler无法处理任务本身.

TaskCreationOptions在一个上下文中的目的是TaskCompletionSource<>什么?

这是一个使用示例:

public Task<WebResponse> Download(string url)
{
    TaskCompletionSource<WebResponse> tcs = 
    new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);

    var client = (HttpWebRequest)HttpWebRequest.Create(url);
    var async = client.BeginGetResponse(o =>
      {
          try
          {
              WebResponse resp = client.EndGetResponse(o);
              tcs.SetResult(resp);
          }
          catch (Exception ex)
          {
              tcs.SetException(ex);
          }
      }, null);


    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

uzu*_*zul 4

答案是 TaskCreationOption 仅对其 AttachToParent 选项有用,因为 TaskCompletionSource 可以是任何其他任务的子任务。与线程管理或执行顺序相关的选项与 TaskCompletionSource 的上下文无关。下面的代码实际上抛出了一个异常:

new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);
Run Code Online (Sandbox Code Playgroud)