我对TaskCompletionSource<>的内部工作有些不清楚。
当使用Task<>创建简单的Factory时,我希望此任务在线程池中排队,除非我指定了TaskCreationOptions.LongRunning,否则它将在新线程中运行。
我对TaskCompletionSource的理解是,我负责在任务结束或失败时触发,并且完全控制如何管理线程。
但是,TaskCompletionSource的cTor允许我指定一个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;
}

最佳答案

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

new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);

08-04 09:06