2013-01-15 8 views
10

TaskCompletionSource<>の内部動作について私に不明な点があります。TaskCompletionSourceを持つTaskCreationOptionsの目的は何ですか?

Factoryを使用して簡単なTask<>を作成するとき、私はそれではなく、新しいスレッドで実行されます​​を、指定しない限り、私は、このタスクは、スレッドプールにエンキューされることを期待します。

TaskCompletionSourceの私の理解は、タスクが終了したとき、または失敗したときにトリガする責任があり、スレッドを管理する方法を完全に制御しているということです。 しかし、TaskCompletionSourceのctorによってTaskCreationOptionsを指定することができます。これは、Schedulerがタスク自体を処理できないことを期待していたため、私を混乱させます。

TaskCompletionSource<>の文脈でTaskCreationOptionsの目的は何ですか?ここで

は使用例です:

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; 
} 
+2

ので、私はそれはいくつかのコードは、TCSまたはタスクに合格し、その結果に基づいて何かをする可能性がありますと仮定します。次のコードは、実際に例外をスローしますこれらのオプションの1つ(このタスクを処理しているカスタムコード内) – Servy

答えて

2

答えはTaskCompletionSourceが他のタスクの子であることができますようTaskCreationOptionは、唯一そのAttachToParentオプションのために有用であるということです。 スレッド管理または実行順序に関するオプションは、TaskCompletionSourceのコンテキストでは関係ありません。さて、あなたは結果のタスクによって使用されたものを見ることができます

new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning); 
+0

'await Download(" http://example.com ")'メソッドであなたのメソッドを呼び出すと、添付ファイルは関係しますか?私は、結果を待っているという事実に基づいて私が暗黙のうちに添付されていると推測します...それ以上のことはありますか? – gzak

+0

「await Download( "http://example.com")は 'Download(" http://example.com ")の構文的な砂糖です.ContinueWith(タスク=> {/* then * /} '。親/子の添付ファイルは関連する可能性がありますが、これはおそらく悪い習慣です。 – uzul

関連する問題