2013-01-15 8 views
10

Jest coś niejasnego dla mnie o wewnętrznych działaniach TaskCompletionSource<>.Jaki jest cel TaskCreationOptions z TaskCompletionSource?

Podczas tworzenia prostego Task<> przy użyciu Factory, oczekuję, że to zadanie zostanie umieszczone w puli wątków, chyba że podam TaskCreationOptions.LongRunning, gdzie będzie on działał w nowym wątku.

Moje zrozumienie TaskCompletionSource polega na tym, że jestem odpowiedzialny za wyzwalanie, gdy zadanie się kończy, lub zawiedzie, i mam pełną kontrolę nad zarządzaniem wątkami. Jednak ctor z TaskCompletionSource pozwala mi określić TaskCreationOptions, a to zmyli mnie, ponieważ oczekiwałem, że Scheduler nie jest w stanie obsłużyć samego zadania.

Jaki jest cel TaskCreationOptions w kontekście TaskCompletionSource<>?

Oto przykład użycia:

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

Cóż, można zobaczyć, co zostało wykorzystane przez powstały zadania, więc przypuszczam, że to możliwe, że niektóre kod może być przekazany do TCS lub zadanie i zrobić coś na podstawie wyniku jednej z tych opcji (w niestandardowym kodzie przetwarzającym to zadanie). – Servy

Odpowiedz

2

Odpowiedź jest taka, że ​​TaskCreationOption jest przydatna tylko dla własnego uznania AttachToParent, jak TaskCompletionSource może być dziecko każdego innego zadania. Opcje związane z zarządzaniem wątkami lub kolejnością wykonywania nie są istotne w kontekście TaskCompletionSource. Poniższy kod faktycznie zgłasza wyjątek:

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

Załóżmy, że wywołuję twoją metodę za pomocą 'await Download (" http://example.com ")', czy przywiązanie ma znaczenie? Zgaduję, że jestem implicite związany z tym, że czekam na wynik ... czy jest coś więcej? – gzak

+0

Przepraszamy za spóźnioną odpowiedź, ponieważ prawdopodobnie wiesz "Czekaj na pobranie" ("http://example.com") "to po prostu cukier syntaktyczny dla' pobierania ("http://example.com") .ContinueWith (task => {/* then * /} '. Tak więc rodzic/dziecko jest ważną opcją, ale jest to prawdopodobnie zła praktyka. – uzul