2014-09-23 6 views
5

की तरह कोड का एक टुकड़ा पर विचार करें:क्या जारी रखने के लिए "अंत में" ऑपरेशन के रूप में जारी रखना सुरक्षित है?

private Task<string> Download() 
{ 
    var wc = new WebClient(); 
    Task<string> backgroundDownload = wc.DownloadStringTaskAsync(this.Uri); 
    // Make sure the WebClient is disposed no matter what. 
    backgroundDownload.ContinueWith((downloadTask) => { wc.Dispose(); }); 
    return backgroundDownload; 
} 

मुझे विश्वास है कि WebClient.Dispose() कॉल होता है और हो सकता है कि किसी भी अपवाद का उत्पादन करने के लिए फोन करने वाले rethrown है के रूप में अगर वहाँ ContinueWith करने के लिए कोई फोन था?

क्या ग्राहक इस ContinueWith देख सकते हैं? (उदाहरण के लिए बाद में ContinueWith पर कॉल करें निपटान कॉल को हटा दें?)

+1

क्या आपने कंसोल जोड़कर अपना कोड आजमाया है। राइटलाइन या संदेशबॉक्स। * जारी रखें * में दिखाएं? –

+1

क्यों न सिर्फ प्रतीक्षा करें? – VoteCoffee

+1

इसके अलावा, यदि आप प्रतीक्षा करते हैं, तो आप डब्ल्यूसी के साथ उपयोग कर सकते हैं और ऐसा करने के लिए जहां भी यह समझ में आता है वहां एक कोशिश/पकड़ ब्लॉक बनाएं। – VoteCoffee

उत्तर

11

आपके पास जो कोड है, उसके साथ आप निश्चित हो सकते हैं कि कोड सफलतापूर्वक पूरा हो गया है या नहीं, इस पर ध्यान दिए बिना जारी किया जाएगा, रद्द कर दिया गया था या अपवाद फेंकता है ।

एक संभावित समस्या आपके समाधान के साथ यह है कि अन्य निरंतरता संभावित रूप से चल सकती है, वेब क्लाइंट का निपटारा करने के पहले, उसके दौरान या उसके बाद। अगर आपको इस क्लीनअप रन से पहले चल रही अन्य निरंतरताओं में कोई समस्या नहीं है तो आपके पास क्या ठीक है। यदि यह एक समस्या है तो आपको मूल कार्य नहीं, बल्कि निरंतरता को वापस करने की आवश्यकता होगी, लेकिन आपको परिणाम (और अपवाद/रद्दीकरण) को सही ढंग से प्रसारित करने की भी आवश्यकता होगी। async के उपयोग इस तरह से आसान के सभी बनाता है:

सभी की
private async Task<string> Download() 
{ 
    using(var wc = new WebClient()) 
     return await wc.DownloadStringTaskAsync(this.Uri); 
} 
0

पहले, निरंतरता प्रदर्शन किया जाएगा, भले ही एक नियमित रूप से अपवाद हो गई। हालांकि आउटऑफमेमरीएक्सप्शन जैसी असाधारण स्थितियों की स्थिति में नियमित अंततः ब्लॉक की तुलना में इसे चलाने की संभावना कम होती है।

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

लेकिन आपके अनुकूलन को करने के लिए सिस्टम को नए धागे बनाना पड़ सकता है। इसके अलावा आप अपने वेब क्लाइंट के जीवनकाल को लंबे समय तक बढ़ा सकते हैं यदि थ्रेडपूल लंबे समय तक चलने वाले कार्यों से भरा हुआ है।

असल में, आपको कम से कम दो बुराइयों का चयन करना होगा और मुझे विश्वास नहीं है कि एक कम जीसी रन आप जो कर रहे हैं उसके लायक है। आपको अपने आवेदन के संदर्भ में इस निर्णय पर विचार करना चाहिए।

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