6

हो जाता है मैं एक निरंतरता त्रुटियों को संभालने के लिए के साथ एक कार्य है:टास्क निरंतरता (OnlyOnFaulted) अभी भी अप्रत्यक्ष अपवाद

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
var loadTask = Task<List<OrderItemViewModel>>.Factory.StartNew(() => 
{ 
     throw new Exception("derp"); 
}); 

var errorContinue = loadTask.ContinueWith(t => 
    { 
     MainViewModel.RemoveViewModel(this); 
    }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler); 

निरंतरता मारा जाता है, लेकिन कुछ ही सेकंड बाद में मैं आवेदन में यह त्रुटि प्राप्त:

कार्य का अपवाद (0) को कार्य पर प्रतीक्षा करके या इसकी अपवाद संपत्ति तक पहुंचकर देखा गया था। नतीजतन, unobserved अपवाद को फाइनलाइज़र थ्रेड द्वारा पुनर्स्थापित किया गया था।

क्या यह uiScheduler से संबंधित है? मैं A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was

उत्तर

6

क्या कर रहा समान प्रश्न का हल मूल रूप से है तुम वास्तव में संभाल करने के लिए (या कम से कम का पालन) अपवाद की जरूरत है:

var errorContinue = loadTask.ContinueWith(t => 
{ 
    // Observe/acknowledge the exception. 
    // You can use t.Wait(), which throws, or just grab the exception 
    var exception = t.Exception; 
    MainViewModel.RemoveViewModel(this); 
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler); 

यह documentation on exception handling in the TPL की इस पंक्ति की वजह से है:

यदि आप किसी अपवाद को प्रसारित करने वाले किसी कार्य पर इंतजार नहीं करते हैं, या इसकी अपवाद संपत्ति तक पहुंच नहीं पाते हैं, तो अपवाद को कचरा एकत्रित होने पर .NET अपवाद नीति के अनुसार अपवादित किया जाता है।

आपके मामले में, आपके पास निरंतरता है, लेकिन आप वास्तव में कभी भी "अपवाद पर प्रतीक्षा करें" या इसकी अपवाद संपत्ति तक पहुंच नहीं सकते। मेरा उत्तर (आपके द्वारा पोस्ट किए गए संबंधित प्रश्न में) का कारण यह है कि मैं वास्तव में का उपयोग कर निरंतरता के माध्यम से कार्य पर अपवाद संपत्ति का उपयोग कर रहा हूं।

+0

माइक्रोसॉफ्ट ने .NET अपवाद नीति को बदल दिया है क्योंकि यह उत्तर लिखा गया था। Https://msdn.microsoft.com/en-us/library/hh367887.aspx#core पर unobserved अपवाद देखें –