2015-06-06 4 views
6

कोड का नमूना:Task.Run से अपवाद फेंकने प्रदर्शित "उपयोगकर्ता कोड से प्रबंधित नहीं" संदेश

using System; 
using System.Threading.Tasks; 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Start"); 
     Foo f = new Foo(); 
     f.FooAsync(); 
    } 

    public class Foo 
    { 
     public async void FooAsync() 
     { 
      try 
      { 
       await Task.Run(() => 
       { 
        Console.WriteLine("Throwing"); 
        throw new Exception(); 
       }); 
      } 
      catch (Exception) 
      { 
       Console.WriteLine("Caught"); 
      } 
     } 
    } 
} 

ऊपर कोड जब सी # बेला से या मेरे पीसी प्रिंट पर कंसोल से चलाएँ:

Start 
Throwing 
Caught 

C# Fiddle Example

हालांकि

, जब मैं दृश्य स्टूडियो से चलाने (डिबग मोड में F5), मैं निम्न संदेश मिलता है:

+०१२३५१६४१०

Exception Picture

मुझे समझ में नहीं आता कि मुझे विजुअल स्टूडियो से "उपयोगकर्ता कोड में प्रबंधित नहीं किया गया" संदेश क्यों मिलता है हालांकि इसे कंसोल या सी # पहेली से चलाना ठीक है। क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?

अद्यतन

मैं मुख्य में काम f.FooAsync().Wait(); पर इंतजार कर की कोशिश की है, लेकिन अभी भी अपवाद बिना क्रिया (एक ही त्रुटि संदेश) होने के रूप में रिपोर्ट किया गया है।

+1

कोड ठीक है, यह आपकी डीबगर सेटिंग्स गलत है। "ओपन अपवाद सेटिंग्स" लिंक पर क्लिक करें, फेंक दिया चेकबॉक्स अनचेक करें। यदि आपने इसे जानबूझकर चालू कर दिया है तो बस जारी रखें पर क्लिक करें। –

+0

@ हंसपैसेंट: धन्यवाद। मैंने पाया [यहां समस्या के बारे में अधिक जानकारी] [http://stackoverflow.com/a/16925282/906773)। –

उत्तर

8

सबसे पहले, क्या इस अपवाद के बारे में विशेष अपवाद वास्तव में उपयोगकर्ता के कोड द्वारा नियंत्रित नहीं कर रहा है कि यह Task.Run से और, कि क्षेत्र के लिए फेंक दिया जा रहा है है।

फ्रेमवर्क आपके लिए बाद में संभालने के लिए लौटाए गए कार्य में अपवाद को पकड़ता है और स्टोर करता है, यदि आप ऐसा करने में विफल रहते हैं तो यह एक अनोखा कार्य अपवाद है (जो नेट 4.0 में एप्लिकेशन को क्रैश कर देगा)।

यहां समस्या यह है कि सेटिंग्स में "बस मेरा कोड सक्षम करें" सुविधा है। जब आप उपयोगकर्ता-कोड छोड़ते हैं और फ्रेमवर्क कोड दर्ज करते हैं तो अपवाद पर डीबगर ब्रेक पर सुविधा चालू होती है और उस बिंदु पर अपवाद वास्तव में संभाला नहीं जाता था।

यदि आप उस सुविधा को डीबगर से बंद करते हैं तो उस अपवाद पर तोड़ नहीं जाएगा क्योंकि यह आपके कोड का ढांचा ढांचे में पालन करेगा और अपवाद को संभालने और कार्य में संग्रहीत किया जाएगा। तब आप को फिर से फेंक दिया जाएगा जब आप await कार्य करते हैं और आपके कोड द्वारा संभाले जाते हैं।


के बाद से निपटने है कि वास्तव में मायने रखती है है एक ढांचे के द्वारा किया जा रहा, यह एक भी सरल उदाहरण है:

public static void Main() 
{ 
    Task.Run(() => 
    { 
     throw new Exception(); 
    }); 
    Console.ReadLine(); 
} 
साथ

"बस मेरे कोड सक्षम" डिबगर पर टूट जाएगा चालू अपवाद, इसके बिना डीबगर नहीं होगा।

+1

मैं मानता हूं कि यह सही जवाब है। –

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