2015-05-15 5 views
10

मैं इंटरएक्टिव एक्सटेंशन के स्रोत कोड पढ़ रहा हूँ और एक line कि मैं नहीं समझ सकता पाया है:सी # कार्य - क्यों एक NOOP लाइन इस मामले में की जरूरत है

public static Task<bool> UsingEnumerator(this Task<bool> task, IDisposable disposable) 
{ 
    task.ContinueWith(t => 
    { 
     if (t.IsFaulted) 
     { 
      var ignored = t.Exception; // don't remove! 
     } 

     if (t.IsFaulted || t.IsCanceled || !t.Result) 
      disposable.Dispose(); 
    }, TaskContinuationOptions.ExecuteSynchronously); 

    return task; 
} 

मैं भी किसी भी प्रासंगिक टिप्पणी नहीं दिख रहा है IsFaulted या Exception गुणों के लिए दस्तावेज़।

इस संदर्भ में var ignored = t.Exception; // don't remove! क्यों इस लाइन की आवश्यकता है?

एक संबंधित प्रश्न: मैंने सोचा कि ऐसी लाइनें रिलीज मोड में ऑप्टिमाइज़ की गई हैं, लेकिन यहां टिप्पणी और मंशा दिया गया है, यदि मामला नहीं है (यदि कोड सही है)। तो यह लाइन रिलीज मोड में क्यों रहती है?

+3

.NET 4 में कार्य अंतिम रूपकर्ता एक अपवाद फेंकता है यदि कोई कार्य गलत है लेकिन इसकी 'अपवाद' संपत्ति का उपयोग नहीं किया गया है। – Lee

+0

@ कृपया धन्यवाद! यह वास्तव में 'अपवाद' संपत्ति के दस्तावेज़ों में लिखा गया है लेकिन मुझे इसे पहले पढ़ने पर समझ में नहीं आया। –

+1

रिलीज बिल्ड में हटाए जाने के संबंध में, 'अनदेखा' स्थानीय हटा दिया जाएगा, लेकिन 'टी अपवाद' को इसके मूल्य के लिए हल किया जाएगा (क्योंकि यह हो सकता है, और इस मामले में, साइड इफेक्ट्स का कारण बनता है) यह बस इतना है रिहाई में मंजिल पर रिटर्न वैल्यू गिरा दिया जाता है, जो एक अपठित चर में संग्रहीत करने के बजाय बनाता है। – Servy

उत्तर

7

यह रेखा के बीच एक अपवाद और एक अबाधित एक के बीच का अंतर है।

नेट 4.0 में एक अप्रत्यक्ष अपवाद के साथ एक कार्य एक UnobservedTaskException फेंक और पूरे आवेदन फाड़ देगा:

"इसके अपवाद आप एक काम है कि एक अपवाद प्रसारित पर इंतजार नहीं करते हैं, या का उपयोग संपत्ति, जब अपशिष्ट कचरा इकट्ठा होता है तो अपवाद को .NET अपवाद नीति के अनुसार बढ़ाया जाता है। "

से Exception Handling (Task Parallel Library)

async-await साथ नेट 4.5 में बदल गया था कि, हालांकि आप वापस app.config (<ThrowUnobservedTaskExceptions enabled="true"/>) का उपयोग पुराने व्यवहार प्राप्त कर सकते हैं।

एक ईवेंट भी है (TaskScheduler.UnobservedTaskException) जो आपको एप्लिकेशन क्रैश होने से पहले ऐसे दोषपूर्ण कार्यों को संभालने की अनुमति देता है। वह घटना अभी भी नेट 4.5 और ऊपर में उठाई जा रही है।

+0

@ सर्वी मैं असहमत हूं। यह बदल गया क्योंकि 'async-await' को त्यागने वाले कार्यों को आम करने के अलावा छोड़ दिया गया था जो पहले नहीं था। – i3arnon

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