2013-01-15 13 views
10

TaskCompletionSource<> की आंतरिक कार्यप्रणाली के बारे में मुझे कुछ अस्पष्ट नहीं है।कार्यसंचार स्रोत के साथ कार्यप्रणाली विकल्प का उद्देश्य क्या है?

का उपयोग करते हुए एक साधारण Task<> बनाते समय, मुझे उम्मीद है कि यह कार्य थ्रेड पूल में लगाया जाएगा, जब तक कि मैं TaskCreationOptions.LongRunning निर्दिष्ट नहीं करता, जहां यह इसके बजाय एक नए धागे में चलाएगा।

TaskCompletionSource की मेरी समझ, यह है कि जब कोई कार्य समाप्त होता है या विफल रहता है, तो मैं ट्रिगर करने के लिए ज़िम्मेदार हूं, और मेरे पास थ्रेड प्रबंधित करने के तरीके पर पूर्ण नियंत्रण है। हालांकि, TaskCompletionSource का ctor मुझे TaskCreationOptions निर्दिष्ट करने की अनुमति देता है, और यह मुझे भ्रमित करता है, क्योंकि मुझे Scheduler कार्य को संभालने में सक्षम नहीं होने की उम्मीद थी।

के संदर्भ में 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

ठीक है, आप देख सकते हैं, जिसके परिणामस्वरूप कार्य के माध्यम से इस्तेमाल किया गया था, इसलिए मुझे लगता है कि यह संभव है कि कुछ कोड परिणाम के आधार पर एक टीसीएस या किसी कार्य से पारित किया जा सकता है और ऐसा कुछ है उन विकल्पों में से एक (कस्टम कोड जो इस कार्य को संसाधित कर रहा है) में से एक है। – Servy

उत्तर

2

जवाब यह है कि एक TaskCreationOption केवल अपने AttachToParent विकल्प के लिए उपयोगी है है के रूप में TaskCompletionSource किसी अन्य कार्य के बच्चे हो सकते हैं:

यहाँ उपयोग का एक उदाहरण है। थ्रेड प्रबंधन या निष्पादन आदेश से संबंधित विकल्प TaskCompletionSource के संदर्भ में प्रासंगिक नहीं हैं। निम्नलिखित कोड वास्तव में एक अपवाद फेंकता है:

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

मान लीजिए कि मैं अपनी विधि को 'प्रतीक्षा डाउनलोड करें ("http://example.com") के साथ कॉल करता हूं, क्या अटैचमेंट मामला है? मुझे लगता है कि मैं इस तथ्य के आधार पर पूरी तरह से जुड़ा हुआ हूं कि मैं परिणाम का इंतजार कर रहा हूं ... या इसके लिए और भी कुछ है? – gzak

+0

देर से उत्तर के लिए खेद है, जैसा कि आप शायद 'इंतजार करना चाहते हैं ("http://example.com")' डाउनलोड ("http://example.com") के लिए सिंटैक्सिक चीनी है। (कार्य => {/* फिर * /} '। इसलिए माता-पिता/बाल अनुलग्नक एक प्रासंगिक संभावना है, लेकिन यह शायद खराब अभ्यास है। – uzul

संबंधित मुद्दे