13

の内部動作について、私には不明確なことがありTaskCompletionSource<>ます。

Task<>を使用して単純なものを作成する場合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;
}
4

1 に答える 1

4

答えは、TaskCompletionSource は他のタスクの子になることができるため、TaskCreationOption はその AttachToParent オプションにのみ役立つということです。スレッド管理または実行順序に関連するオプションは、TaskCompletionSource のコンテキストには関係ありません。次のコードは、実際に例外をスローします。

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