answers to this question के माध्यम से पढ़ना मुझे इस बात के बारे में सोचने के लिए प्रेरित करता है कि प्रतीक्षा कार्य जब फंसे हुए कार्य को फेंकता है। क्या सभी "क्लाइंट" अपवाद का पालन करते हैं? मैं मानता हूं कि मैं यहां कुछ चीजों को भ्रमित कर सकता हूं; यही कारण है कि मैं स्पष्टीकरण के लिए पूछ रहा हूं।क्या होता है जब एकाधिक समांतर धागे एक ही कार्य उदाहरण का इंतजार करते हैं जो तब फेंकता है?
मैं एक ठोस परिदृश्य पेश होगा ... चलो कहते हैं कि मैं लंबे समय से चल Task
उदाहरणों में से एक वैश्विक संग्रह, ग्राहकों द्वारा शुरू के साथ एक सर्वर चला रहे हैं। एक या अधिक कार्यों को शुरू करने के बाद, एक ग्राहक अपनी प्रगति पर सवाल उठा सकता है और परिणाम उपलब्ध होने पर परिणाम प्राप्त कर सकता है, साथ ही साथ होने वाली त्रुटियों के साथ भी।
कार्य स्वयं बहुत अलग व्यापार-विशिष्ट चीजें कर सकते हैं - आम तौर पर, कोई भी दो समान नहीं होते हैं। हालांकि, यदि कोई ग्राहक पहले से शुरू होने के समान कार्य शुरू करने का प्रयास करता है, तो सर्वर को इसे पहचानना चाहिए और दूसरे क्लाइंट को एक नई प्रतिलिपि बनाने के बजाय मौजूदा कार्य में "संलग्न" करना चाहिए।
अब, हर बार किसी भी ग्राहक कार्य में रुचि है की स्थिति प्रश्नों, इन पंक्तियों के साथ कुछ करता है:
var timeout = Task.Delay(numberOfSecondsUntilClientsPatienceRunsOut);
try
{
var result = await Task.WhenAny(timeout, task);
if (result == timeout)
{
// SNIP: No result is available yet. Just report the progress so far.
}
// SNIP: Report the result.
}
catch (Exception e)
{
// SNIP: Report the error.
}
संक्षेप में, यह काम कुछ उचित समय क्या यह पहली बार कर रहा है खत्म करने के लिए देता है , फिर चल रही प्रगति की रिपोर्ट करने के लिए वापस आ जाता है। इसका मतलब है कि समय की एक संभावित महत्वपूर्ण खिड़की है जिसमें कई ग्राहक एक ही कार्य को विफल कर सकते हैं।
मेरा प्रश्न है: यदि कार्य इस विंडो के दौरान फेंकने के लिए होता है, तो क्या सभी ग्राहकों द्वारा अपवाद (और संभाला जाता है) है?
"लौटाया गया कार्य पूरा हो जाएगा जब किसी भी आपूर्ति किए गए कार्यों को पूरा कर लिया जाएगा। लौटाया कार्य हमेशा 'RanToCompletion' राज्य में समाप्त होगा, इसके परिणाम 'सेट' के साथ पहले कार्य में सेट होगा। यह सच है भले ही पहले रद्द या फॉल्ट राज्य में समाप्त होने के लिए कार्य। " यदि 'टास्क 'दोष, और पूरा हो गया है, और एक से अधिक ग्राहक इस निर्माण के माध्यम से इसका इंतजार कर रहे हैं, तो उन सभी को दोषपूर्ण कार्य दिखाई देगा। यदि वे 'कार्य' (नतीजे 'नहीं' के परिणाम का निरीक्षण करने का प्रयास करते हैं तो उनमें से सभी को अपवाद मिलेगा। यह "पहले आओ, पहले मिलता है" सौदा नहीं है। –
इस आगे सरल करने के लिए: यदि आप का इंतजार है 'Task.Run ((=)> नया अपवाद फेंक (DateTime.Now.Ticks.ToString()))' एक पंक्ति (अपवाद संचालक के साथ) में कई बार, आप एक मिल जाएगा प्रत्येक बार अपवाद, एक ही समय के टिकट के साथ (कार्य को साबित करने के लिए कई बार निष्पादित नहीं किया जा रहा है)। एक दोषपूर्ण कार्य आपको पसंद के रूप में कई अपवादों का उत्पादन कर सकता है। –
दिलचस्प सवाल है, लेकिन अपने आप को परीक्षण करने के लिए पर्याप्त आसान है। – spender