2011-09-15 15 views
14

TaskCompletionSource.Task पर पर पर पहले से ही कॉल किया जा रहा है, तो ContinueWith(...) विधि का उपयोग करना सुरक्षित है?क्या यह कार्यवाही विधि को TaskCompletionSource.Task पर कॉल करना सुरक्षित है (जिसका यह है। .SetResult कहा जाता है)?

// this was written inside the question box, please excuse any silly errors and lack of error checking (I'm not near VS right now)... 

private WebClient _webClient = new WebClient(); 

public Task<string> GetExamplePage() { 

    var tcs = new TaskCompletionSource<string>(); 

    web.DownloadStringCompleted += (s, ea) => tcs.SetResult(ea.Result); 

    web.DownloadStringAsync(new URI(@"http://www.example.com/example.html")); 

    return tcs.task; 
} 

public void ProcessExamplePage() { 

    var task = GetExamplePage(); 

    Thread.Sleep(1000); 

    task.ContinueWith(t => Console.WriteLine(t.Result)); // *line in question* 
} 

Console.WriteLine(...) पर अमल करेंगे, तो WebClient.DownloadStringCompleted घटना पहले से ही task.ContinueWith सेट किया गया है से पहले निकाल दिया गया है:

यह बुनियादी कोड उम्मीद है कि सवाल फ्रेम करने के लिए मदद मिलेगी?

MSDN यह कहना (Task.ContinueWith) है:

Task.ContinueWith विधि

लौटे वर्तमान कार्य पूरा कर लिया है जब तक कार्य निष्पादन के लिए निर्धारित नहीं की जाएगी, चाहे वह चल रहा है की वजह से पूरा करता है सफलतापूर्वक पूरा हो रहा है, एक अनचाहे अपवाद के कारण गलती, या रद्द होने के कारण जल्दी बाहर निकल रहा है।

दुर्भाग्यवश यह उल्लेख नहीं करता कि क्या होता है यदि इस विधि को बुलाया जाता है और कार्य पहले ही पूरा हो चुका है।

आपके द्वारा प्रदान की जा सकने वाली किसी भी जानकारी के लिए अग्रिम धन्यवाद! :)

उत्तर

17

हां यह ठीक होना चाहिए, जारी रखें यदि पिछले कार्य पूरा हो गया है या नहीं, तो यदि यह तुरंत निरंतरता को कतार में रखेगा।

+2

क्या यह एक नया एसिंक्रोनस ऑपरेशन शुरू करेगा या यह सिंक्रनाइज़ेशन जारी रहेगा? चूंकि 'टास्क कॉम्प्लेशनसोर्स 'ने एसिंक्रोनस ऑपरेशन शुरू नहीं किया था। – annemartijn

+0

अच्छा। इसके बारे में दस्तावेज़ीकरण का एक संदर्भ महान होगा। –

+0

यह @annemartijn मूल कार्य (या निरंतरता) निर्दिष्ट करती है कि 'TaskCreationOptions पर निर्भर करता है RunContinuationsAsynchronously' (या' TaskContinuationOptions भागो निरंतरता Asynchronously'।) -। ये उनके * निरंतरता के लिए लागू * केवल - - और/या निरंतरता 'टास्क कंटिन्यूशनऑप्शन' निर्दिष्ट करती है। निष्पादन सिंक्रनाइज़ेशन '(यह एक निरंतरता पर लागू होती है)। –