किसी टास्क के अपवाद को या तो टास्क पर प्रतीक्षा करने या उसकी अपवाद संपत्ति तक पहुंचने से नहीं देखा गया। नतीजतन, अप्रतिबंधित अपवाद था


100

इसका क्या मतलब है और इसे कैसे हल किया जाए?

मैं टीपीएल कार्यों का उपयोग कर रहा हूं।

पूरी त्रुटि

किसी टास्क के अपवाद को या तो टास्क पर प्रतीक्षा करने या उसकी अपवाद संपत्ति तक पहुंचने से नहीं देखा गया। नतीजतन, अंतिम थ्रेड द्वारा अप्रमाणित अपवाद को फिर से हटा दिया गया था।

System.Threading.Tasks.TaskExceptionHolder.Finalize () पर

mscorlib

जवाबों:


158

यदि आप एक टास्क बनाते हैं, और आप कभी भी कॉल नहीं करते हैं task.Wait()या रिजल्ट प्राप्त करने का प्रयास नहीं करते हैं Task<T>, जब कचरा संग्रहकर्ता द्वारा कार्य एकत्र किया जाता है, तो यह अंतिम रूप से आपके आवेदन को फाड़ देगा। विवरण के लिए, TPL में अपवाद हैंडलिंग पर MSDN का पृष्ठ देखें ।

यहां सबसे अच्छा विकल्प अपवाद को "संभाल" करना है। यह एक निरंतरता के माध्यम से किया जा सकता है - आप कार्य के लिए एक निरंतरता संलग्न कर सकते हैं, और उस अपवाद को लॉग / निगल / आदि कर सकते हैं। यह कार्य अपवादों को लॉग करने का एक साफ तरीका प्रदान करता है, और इसे एक सरल एक्सटेंशन विधि के रूप में लिखा जा सकता है, अर्थात:

public static void LogExceptions(this Task task)
{
    task.ContinueWith( t =>
    {
         var aggException = t.Exception.Flatten();
         foreach(var exception in aggException.InnerExceptions)
             LogException(exception);
    }, 
    TaskContinuationOptions.OnlyOnFaulted);
}

उपरोक्त के साथ, आप किसी भी कार्य को एप्लिकेशन को फाड़ने से रोक सकते हैं, और इसे लॉग इन कर सकते हैं:

Task.Factory.StartNew( () => 
   { 
       // Do your work...
   }).LogExceptions();

वैकल्पिक रूप से, आप TaskScheduler.UnobservedTaskException की सदस्यता ले सकते हैं और इसे वहां संभाल सकते हैं।


17
अतिरिक्त मनोरंजन के लिए, Offअपनी पसंद के चार-अक्षर वाले शब्द के रूप में नामित एक वर्ग में एक स्थिर स्टब विधि है, और अपनी पकड़-सभी निरंतरताओं के लिए इसका उपयोग करें। इस विशेष अपवाद से कुछ पैंट-अप हताशा से निपटने में मदद करता है।
Aaronaught

1
@MonsterMMORPG हाँ - आपको मूल रूप से अपवाद को पकड़ना या संभालना है । जब तक आप इसे कहीं संभालते हैं, आपकी मूल समस्या दूर हो जाएगी।
रीड कोपसी

1
क्या यह संभव नहीं है कि कार्य जारी रखने के लिए कॉल करने से पहले एक अपवाद फेंक सकता है?
टिम सिल्वेस्टर

1
@TimSylvester फ्रेमवर्क अभी भी निरंतरता के माध्यम से मैप करेगा, भले ही यह "इससे पहले" हो जाए "निरंतरता जुड़ी हुई है
रीड कोप्स

32
महत्वपूर्ण नोट: यह केवल के लिए आवश्यक है .Net 4.0। अपवाद हैंडलिंग अनुप्रयोग को फाड़ नहीं.net 4.5 करने के लिए डिफ़ॉल्ट रूप से बदल दिया गया था । .NET 4.5
i3arnon

43

ज़रूर; इसका मतलब है कि Taskकचरा संग्रहण के लिए छोड़ दिया जाने के बाद इसे अंतिम रूप दिया गया, लेकिन यह कार्य स्वयं विफल हो गया। दो फिक्सेस हैं:

  • संभाल कार्यों सीधे (प्रयोग असफल ContinueWith(...)सदस्यता के लिए, और जाँच .IsFaultedऔर .Exceptionपर Taskपैरामीटर में)
  • TaskScheduler.UnobservedTaskExceptionघटना को संभालें , और इसे चिह्नित करें ( e.SetObserved()त्रुटि लॉग करने के बाद कॉल करें )

4
+1 - एक जोड़ के साथ - यदि आपकी निरंतरता कुछ भी नहीं कर रही है IsFaulted, लेकिन जाँच कर रही है , तो आप OnlyOnFaultedनिरंतरता विकल्प का उपयोग कर सकते हैं और मैनुअल चेक से बच सकते हैं ...
रीड कोपसे

वास्तव में यह हुआ है जहाँ मैं एक tpl कार्य के अंदर एक सार्वजनिक स्थैतिक समारोह कहा जाता है। ट्राई कैच के इस्तेमाल से इस समस्या का समाधान होगा? क्या मुझे वास्तव में एक और कार्य बनाने और प्रतीक्षा करने की आवश्यकता है? धन्यवाद
मॉन्स्टरमोरपीजी

4
यह उल्लेख SetObservedकरने की UnobservedTaskExceptionEventArgsआवश्यकता पर उल्लेख करने के लिए +1 ।
जेम्स वेबस्टर

-17

इसको आजमाओ:

public static void ThrowFirstExceptionIfHappens(this Task task)
{
    task.ContinueWith(t =>
    {
        var aggException = t.Exception.Flatten();
        foreach (var exception in aggException.InnerExceptions)
        {
            throw exception; // throw only first, search for solution
        }
    },
    TaskContinuationOptions.OnlyOnFaulted); // not valid for multi task continuations
}

public static Task CreateHandledTask(Action action) 
{
    Task tsk = Task.Factory.StartNew(action);
    tsk.ThrowFirstExceptionIfHappens();
    return tsk;
}

5
इसका एक ??? आपका क्या अर्थ है? क्या आप बता सकते हैं कि आपके उत्तर में अब तक के उत्तर में क्या योगदान है?
गर्ट अर्नोल्ड

आपने लगातार एक नया कार्य बनाया है, जो तब विफल रहेगा और उसी स्थिति में पहुंच जाएगा।
रॉबर्ट टेलर

यह समाधान थोड़ा जटिल लगता है। मुझे लगता है कि आप बिना किसी लाभ के अनायास ही कार्यक्षमता छिपा रहे होंगे।
वेलोकैट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.