2013-01-15 27 views
10

TaskCompletionSource<>'un iç işleyişi hakkında bana net olmayan bir şey var. TaskCompletionSource ile TaskCreationOptions'ın amacı nedir?

Factory kullanarak basit Task<> oluşturarak

, ben bunun yerine yeni bir iş parçacığı çalışır TaskCreationOptions.LongRunning, belirtmedikçe bu görevi, bir iş parçacığı havuzunda kuyruğa bekliyoruz. TaskCompletionSource ait

Benim anlayış, bir görev sona erdiğinde ben tetikleme sorumlu olduğumu, ya da başarısız olur ve ben konuları yönetme konusunda tam kontrole sahip. Ancak TaskCompletionSource ait ctor beni TaskCreationOptions belirlemenizi sağlar, ve ben görevi kendi başına halledebileceğini olmamak Scheduler bekliyordum çünkü bu, beni karıştırmayın.

TaskCompletionSource<> kapsamında TaskCreationOptions'un amacı nedir? TaskCompletionSource başka bir görevin çocuk olabildiğince

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

, bu yüzden bazı kod sonucuna dayanarak bir şey, bir TCS veya Görev geçti ve bunu edilebileceğini mümkün tabii: Aşağıdaki kod aslında bir istisna atar Bu seçeneklerden birinin (bu görevi işleyen özel kodda). – Servy

cevap

2

cevap, bir TaskCreationOption sadece AttachToParent seçeneği için kullanışlı olmasıdır: Burada

kullanımına ilişkin bir örnektir. İş parçacığı yönetimi veya yürütme siparişi ile ilgili seçenekler bir TaskCompletionSource bağlamında alakalı değildir. Eğer ortaya çıkan görev yoluyla kullanılan görebilirsiniz, Eh

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

Diyelim ki, “Download” ("http://example.com") 'ile beklemeyi tercih ederim. Sonucunu beklediğim gerçeğine dayalı olarak örtük olarak bağlı olduğumu tahmin edebilir miyim ... yoksa daha fazlası var mı? – gzak

+0

Geç cevaplar için özür dilerim, muhtemelen sizi beklediğini bildiği gibi ("http://example.com") sadece İndirme ("http://example.com") için sözdizimsel şekerdir./* Sonra * /} 'Bu nedenle ebeveyn/çocuk eki ilgili bir olasılıktır, ancak bu muhtemelen kötü bir uygulamadır. – uzul