2011-10-25 12 views
7

http://msdn.microsoft.com/en-us/library/dd997415.aspxTPL अपवाद

लेख मैं ऊपर संदर्भित प्रति हैंडलिंग एक continuatin कार्य में अपवाद को संभालने के लिए कोशिश कर रहा हूँ। उदाहरण मैं ऊपर लेख में हवाला हूँ यह है:

var task1 = Task.Factory.StartNew(() => 
{ 
    throw new MyCustomException("Task1 faulted."); 
}) 
.ContinueWith((t) => 
    { 
     Console.WriteLine("I have observed a {0}", 
      t.Exception.InnerException.GetType().Name); 
    }, 
    TaskContinuationOptions.OnlyOnFaulted); 

मेरे कोड है:

Task<string> task = Task<string>.Factory.StartNew(() => process.StartTask(this)); 
task.ContinueWith(CloseDialog, TaskContinuationOptions.OnlyOnFaulted); 

StartTask में, मैं सिर्फ उदाहरण की तरह एक त्रुटि फेंक देते हैं। मेरी उम्मीद है कि CloseDialog निष्पादित होगा और मैं कार्य की जांच कर सकता हूं। उदाहरण के अनुसार उस पद्धति के भीतर अपवाद। हालांकि जब मैं अपवाद फेंकता हूं तो कोड बस एक अनचाहे अपवाद के साथ बंद हो जाता है। क्या मुझे कोशिश/पकड़ ब्लॉक का उपयोग करना चाहिए? यदि हां, तो कहाँ? वैसे, मैं हमेशा अपना निरंतर कार्य (CloseDialog) चलाने के लिए चाहता हूं। मैं बस उपयोग कर रहा हूँ। केवलऑनफॉल्ट क्योंकि उदाहरण में दिखाया गया है।

उत्तर

10

पूर्ववर्ती कार्य की अपवाद संपत्ति द्वारा पूर्ववर्ती Task द्वारा अपवाद फेंक दिया गया है, तो एक निरंतरता पता लग सकती है। प्रिंट सांत्वना

Task task1 = Task.Factory.StartNew (() => { throw null; }); 
Task task2 = task1.ContinueWith (ant => Console.Write(ant.Exception()); 

करने के लिए एक NullReferenceException के परिणाम निम्न task1 एक अपवाद फेंकता है और यह अपवाद/कैप्चर नहीं किया गया निरंतरता द्वारा पूछे यह बिना क्रिया माना जाता है और आवेदन मर जाता है। निरंतरता के साथ यह Status कीवर्ड के माध्यम से कार्य का परिणाम स्थापित करने के लिए

asyncTask.ContinueWith(task => 
{ 
    // Check task status. 
    switch (task.Status) 
    { 
     // Handle any exceptions to prevent UnobservedTaskException.    
     case TaskStatus.RanToCompletion: 
      if (asyncTask.Result) 
      { 
       // Do stuff... 
      } 
      break; 
     case TaskStatus.Faulted: 
      if (task.Exception != null) 
       mainForm.progressRightLabelText = task.Exception.InnerException.Message; 
      else 
       mainForm.progressRightLabelText = "Operation failed!"; 
     default: 
      break; 
    } 
} 

आप या तो एक try/catch ब्लॉक में काम पर प्रतीक्षा करने या किसी कार्य के Result में क्वेरी करने के लिए है कि आप निरंतरता उपयोग नहीं करते हैं पर्याप्त है एक try/catch ब्लॉक

int x = 0; 
Task<int> task = Task.Factory.StartNew (() => 7/x); 
try 
{ 
    task.Wait(); 
    // OR. 
    int result = task.Result; 
} 
catch (AggregateException aggEx) 
{ 
    Console.WriteLine(aggEx.InnerException.Message); 
} 

आशा इस मदद भले ही वह थोड़ी देर हो चुकी है और आप सभी जानते हैं कि वहाँ अब तक है! :]

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