13

我对TaskCompletionSource<>.

使用 创建简单Task<>Factory,我希望此任务在线程池中排队,除非我指定TaskCreationOptions.LongRunning,否则它将在新线程中运行。

我对 的理解TaskCompletionSource是,我负责在任务结束或失败时触发,并且我可以完全控制如何管理线程。但是, ctorTaskCompletionSource允许我指定 a TaskCreationOptions,这让我感到困惑,因为我期待Scheduler无法处理任务本身。

TaskCreationOptions在 a 的上下文中的目的是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;
}
4

1 回答 1

4

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

new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);
于 2013-01-18T12:52:12.753 回答