2014-06-26 14 views
11

मैंने सोचा था कि एसिंक विधियों को सामान्य तरीकों की तरह व्यवहार करना चाहिए जब तक कि वे प्रतीक्षा में न आए।अनचाहे एसिंक तरीकों का अपवाद क्यों नहीं फेंकता है?

यह अपवाद क्यों नहीं फेंकता है?

क्या प्रतीक्षा किए बिना अपवाद को फेंकने का कोई तरीका है?

using System; 
using System.Threading.Tasks; 

public class Test 
{ 
    public static void Main() 
    { 
     var t = new Test(); 
     t.Helper(); 
    } 

    public async Task Helper() 
    { 
     throw new Exception(); 
    } 
} 
+1

एक ऐतिहासिक नोट के रूप में, अपवाद मूल रूप से "सीधे" उठाए गए थे जैसा आप उम्मीद करते थे। हालांकि, यह व्यवहार भ्रमित था क्योंकि 'प्रतीक्षा' के पहले और बाद में अपवाद अलग-अलग व्यवहार करेंगे, और अगर 'प्रतीक्षा' सशर्त था तो यह वास्तव में * भ्रमित हो सकता था। –

+0

@StephenCleary यह कब बदला गया था? सीटीपी चरण में जबकि? – i3arnon

+1

@ I3arnon: हाँ; आईआईआरसी केवल पहला सीटीपी इस तरह से व्यवहार किया। –

उत्तर

14

एक अपवाद एक async विधि के अंदर फेंक दिया, डिजाइन द्वारा, लौटे कार्य के अंदर संग्रहित है।

  1. await कार्य: await t.Helper();
  2. Wait कार्य: t.Helper().Wait();
  3. के बाद काम के Exception संपत्ति चेक कार्य पूरा हो चुका है: var task = t.Helper(); Log(task.Exception);
  4. अपवाद आप कर सकते हैं पर अपने हाथों को प्राप्त करने के लिए अपवाद को संभालने वाले उस कार्य में निरंतरता जोड़ें: t.Helper().ContinueWith(t => Log(t.Exception), TaskContinuationOptions.OnlyOnFaulted);

आपका सबसे अच्छा विकल्प पहला है। बस await कार्य और अपवाद को संभालें (जब तक कि कोई विशिष्ट कारण न हो जो आप ऐसा नहीं कर सकते)। Task Exception Handling in .NET 4.5

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