निम्नलिखित मानते हैं .NET 4.0, और डिफ़ॉल्ट कार्यस्कूलर का उपयोग करना।
सभी नोटिस पहले कि अपवाद अंदर प्रतिनिधियों आप पारित उठाया जाता है, तो वे, एक अलग धागे में उठाए गए हैं वह नहीं जिसका आप (तार्किक) अपने catch
कर रहे हैं में। तो किसी भी तरह अपवाद को थ्रेड से प्रचारित किया जाना चाहिए जो आपके प्रतिनिधि/लैम्ब्डा कोड को थ्रेड/कार्य शुरू करने वाले व्यक्ति को निष्पादित करता है।
नोट Task
के लिए, मुझे लगता है कि पुस्तकालय भी अपने आप धागे पर इसे चलाने के लिए नहीं चुन सकते हैं कि, बल्कि बुला धागे पर (लेकिन मुझे यकीन है कि अगर यह है कि केवल Parallel.ForEach
, आदि के लिए सच था और नहीं कर रहा हूँ एक "नग्न" Task
ऑब्जेक्ट के लिए नहीं)।
के लिए है कि दो होता है, दो बातें पूरा किया जाना चाहिए:
- बुला धागा अभी भी सक्रिय है। अन्यथा कुछ भी नहीं बचा है जो वास्तव में पकड़ कर सकता है।
- थ्रेड/कार्य में होने वाले अपवाद को किसी भी तरह से संरक्षित किया जाना चाहिए और इसे पकड़ने के लिए आपके लिए पुन: उपयोग किया जाना चाहिए।
ऐसा कहकर, आपके दोनों उदाहरण थ्रेड/कार्य को समाप्त करने की प्रतीक्षा नहीं करते हैं। पहले उदाहरण में आप task.Wait()
(या समान) और दूसरे में thread.Join()
खो रहे हैं। आपके परीक्षण कोड समय व्यवहार के आधार पर इसका अर्थ यह हो सकता है कि आप थ्रेड/कार्य (ऊपर आइटम 1) से अपवाद का पालन नहीं कर पाएंगे।
टास्क उदाहरण:
यहां तक कि अगर आप दो कॉल जोड़ें यह है कि क्या मुझे (फिर .NET 4.0) के लिए होता है task.Wait()
करने के लिए कॉल वास्तव में अपवाद मूल रूप से कार्य में बिना क्रिया छोड़ दिया reraises प्रतिनिधि (यह आपके लिए आंतरिक रूप से टीपीएल करेगा), यह System.AggregateException
के अंदर लपेटता है, जिसे आप देख सकते हैं कि क्या आप कुछ और सटीक "कैच-ऑल" के बाद कुछ और सटीक उपयोग करेंगे।
थ्रेड उदाहरण: अपवाद प्रतिनिधि द्वारा उठाए बिना क्रिया रहता है और आपके आवेदन बाहर निकलता है इस प्रकार मैं उदाहरण के लिए होता है
दूसरे शब्दों में (जब तक आप unhandled exceptions differently से निपटने के लिए कुछ भी कर):
// Thread example
var thread = new Thread(() => { throw null; });
thread.Start();
thread.Join();
// Should never reach here, depending on timing sometimes not even
// until the Join() call. The process terminates as soon as the other
// thread runs the "throw null" code - which can logically happen somewhere
// after the "start" of the "Start()" call.
// Task example
try
{
var task = new Task(() => { throw null; });
task.Start();
task.Wait();
}
catch (AggregateException ex)
{
Console.WriteLine("Exception: " + ex);
}
स्रोत
2012-01-10 12:54:16
संस्करण संख्या को 5.0 से 4.5 तक बदल दिया - आशा है कि आपको कोई फर्क नहीं पड़ता। (यह सी # 5 होगा, लेकिन .NET 4.5।) –
@ जोन बिल्कुल नहीं; वास्तव में, मुझे सही करने के लिए धन्यवाद। –