2012-11-07 22 views
5

मैं मूल रूप से सोच रहा हूं कि सी # में, मुझे await कीवर्ड के माध्यम से प्रतीक्षा किए जाने वाले एसिंक्रोनस विधियों से अपवाद प्राप्त करना चाहिए। उदाहरण के लिए निम्नलिखित छोटे कंसोल प्रोग्राम पर विचार करें, जिसमें सबसे महत्वपूर्ण रूप से AwaitSync नामक विधि शामिल है। AwaitSyncTestAsync पर कॉल करता है, जो एक कार्य देता है जब निष्पादित किया गया अपवाद फेंकता है। मैं AwaitAsync, में अपवाद को पकड़ने का प्रयास करता हूं लेकिन यह अनचाहे हो जाता है।मैं सी # में एक एसिंक्रोनस विधि से अपवाद कैसे प्राप्त करूं?

class Program 
{ 
    static void Main(string[] args) 
    { 
     AwaitAsync(); 
     Console.ReadKey(); 
    } 

    static async Task AwaitAsync() 
    { 
     try 
     { 
      await TestAsync(); 
     } 
     catch (Exception) 
     { 
      Console.WriteLine("Exception caught"); 
     } 
    } 

    static Task TestAsync() 
    { 
     return Task.Factory.StartNew(() => { throw new Exception("Test"); }); 
    } 
} 

मैं कैसे टास्क TestAsync द्वारा लौटाए से अपवाद को पकड़ने के बारे में जाने के लिए चाहिए? हालांकि यह उदाहरण एक कंसोल प्रोग्राम है, मेरी वास्तविक जीवन समस्या एएसपी.नेट एमवीसी/वेब एपीआई के संदर्भ में है।

संपादित करें: बाहर कर देता है अपवाद पकड़ा हो रही है, तकनीकी कारणों से मैं सिर्फ 'अपवाद पकड़ा' संदेश नोटिस नहीं किया था इससे पहले कि टर्मिनल बंद कर दिया। किसी भी मामले में, जॉन स्कीट का जवाब await और अपवाद हैंडलिंग की मेरी समझ के लिए बहुत मूल्यवान था।

+1

क्या आप कह रहे हैं कि यह काम नहीं करता है? – jishi

+2

जब मैं आपका कोड चलाता हूं, तो मुझे "अपवाद पकड़ा गया" दिखाई देता है। – spender

+0

यह मेरे लिए पकड़ा नहीं जाता है। मैं फिर से जांच करूंगा। – aknuds1

उत्तर

10

कोड await अभिव्यक्ति TaskAwaiterTaskTestAsync द्वारा लौटाए के साथ जुड़े पर GetResult() कॉल करेंगे के लिए उत्पन्न।

GetResult देखेंगे कि काम गलती है, काम के भीतर AggregateException से पहले अपवाद लाने, और फेंक कि। देखते हैं, लेकिन यदि आप जो कई अपवाद है किसी कार्य का इंतजार है, आप केवल पहले एक जब तक आप विशेष कदम उठाने देखेंगे (-

शुद्ध नतीजा यह है कि अपनी पकड़ ब्लॉक अपवाद अपने कार्य में फेंक दिया पकड़ेगा है इस के लिए विभिन्न दृष्टिकोण)।

जैसा कि आप दावा कर रहे हैं कि अपवाद वास्तव में अनचाहे हो जाता है, ऐसा लगता है कि आपके द्वारा दिखाए गए कोड के अलावा आपके कोड में कुछ ऐसा है - जैसा कि आपने दिया है कोड निश्चित रूप से काम करना चाहिए, और मेरे लिए करता है।

+0

धन्यवाद, दोपहर के भोजन के बाद विस्तृत होगा। – aknuds1

+0

यह पता चला है कि अपवाद वास्तव में पकड़ा गया है, लेकिन कार्यक्रम समाप्त करने के लिए एक कुंजी दबाए जाने से पहले पुष्टि संदेश कंसोल पर नहीं लिखा गया है। इसलिए मैंने पहले संदेश मुद्रित होने वाला संदेश नहीं देखा था। अनुमान लगाएं कि एसिंक्रोनि का उपयोग कुछ हो रहा है :) – aknuds1

+0

धन्यवाद, मेरी समझ के लिए बहुत उपयोगी, अपवाद के साथ कितने अपवादों को संभाला जाता है, इस बारे में आपकी व्याख्या के लिए बहुत बहुत धन्यवाद। – aknuds1