OperationCanceledException और TaskCanceledException के बीच अंतर?


101

बीच क्या अंतर है OperationCanceledExceptionऔर TaskCanceledException? अगर मैं .NET 4.5 का उपयोग कर रहा हूं और async/ awaitकीवर्ड का उपयोग कर रहा हूं, तो मुझे किसको पकड़ना चाहिए?

जवाबों:


117

OperationCanceledExceptionके लिए बस आधार वर्ग है TaskCanceledException- इसलिए यदि आप पूर्व को पकड़ते हैं, तो आप बाद में भी पकड़ लेंगे।

समवर्ती संग्रहों पर कुछ संक्रियाएँ सिर्फ इसलिए फेंकती हैं OperationCanceledException, क्योंकि इसमें कोई वास्तविक कार्य शामिल नहीं हैं (कम से कम जहाँ तक सार्वजनिक एपीआई का संबंध है)। BlockingCollection.TryTakeएक उदाहरण के लिए देखें ।

मैं OperationCanceledExceptionसिर्फ एक मामले में कार्य को रद्द कर दूंगा जो एक ऑपरेशन के कारण रद्द कर दिया गया था जो कि सिर्फ फेंक दिया गया था OperationCanceledException- आप शायद अभी भी "बस रद्द" के रूप में व्यवहार करना चाहते हैं।


1
मैं स्टीफन टूब के ब्लॉग blogs.msdn.microsoft.com/pfxteam/2012/03/05/… से ज्यादातर फोर्सेअंश के साथ आया था । फिर अगर मैं await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );किसी तरह से एक अपवाद को फेंक देता हूं तो इसे टास्ककैन्लेड अपवाद के रूप में बदल दिया जाता है। किसी भी विचार कैसे हो सकता है? यह मेरे लिए समस्या है क्योंकि मैं एक 'true' OperationCanceledException को कैच (OperationCanceledException) के माध्यम से पकड़ना चाहता हूं, लेकिन मैं नहीं चाहता कि यह TaskCanceledException (जो वास्तव में ApplicationException होनी चाहिए) पकड़ा जाए।
टेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.