2013-01-15 29 views
10

我還不清楚TaskCompletionSource<>的內部運作情況。TaskCreationOptions與TaskCompletionSource的用途是什麼?

當使用Factory創建一個簡單的Task<>,我希望這個任務在一個線程池來排隊,除非我指定​​,它會在一個新線程上運行,而不是。

我對TaskCompletionSource的理解是,我負責在任務結束或失敗時觸發,並且我完全控制如何管理線程。 但是,TaskCompletionSource的ctor允許我指定TaskCreationOptions,這讓我感到困惑,因爲我期待Scheduler無法處理任務本身。

TaskCreationOptionsTaskCompletionSource<>的背景下的目的是什麼?

下面是使用的例子:

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或任務,做一些其中一個選項(在處理此任務的自定義代碼中)。 – Servy

回答

2

答案是,TaskCreationOption僅用於其AttachToParent選項很有用,因爲TaskCompletionSource可以是任何其他任務的孩子。 線程管理或執行順序相關的選項在TaskCompletionSource的上下文中不相關。下面的代碼實際上拋出一個異常:

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

假設我用'await Download(「http://example.com」)來調用你的方法,附件是否重要?我想我是基於我正在等待結果的事實而隱含地附加的......或者還有更多嗎? – gzak

+0

對不起,因爲你可能知道'await Download(「http://example.com」)只是下載(「http://example.com」)的syntaxic糖.ContinueWith(任務=> {/*然後* /}'。因此,父母/子女依戀是一種相關的可能性,但這可能是不好的做法。 – uzul