सभी, वहाँ ऊपर विषय पर कई सवाल हैं, लेकिन मेरा मानना है कि यह पर्याप्त रूप से एक नया सवाल वारंट अलग है। मैं निम्नलिखित Task
और कार्य Status
की एक किस्म से निपटने के लिए एक निरंतरता है, TaskStatus.RanToCompletion
, TaskStatus.Canceled
और TaskStatus.Faulted
के माध्यम से निश्चित रूप से AggregateException
। कोड की तरहTPL और एक्सेप्शन हैंडलिंग
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
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;
}
}
लग रहा है यह सब अच्छी तरह से काम करता है, लेकिन मैं चिंतित है या नहीं, मैं यह सही कर रहा हूँ कर रहा हूँ, के रूप में वहाँ एक AggregateException
की संभावना है निरंतरता के भीतर से फेंक दिया जा रहा है - फिर क्या?
मैं अपने asyncTask
पर Wait
नहीं चाहता हूं और न ही निरंतरता के रूप में यह यूआई थ्रेड पर वापसी को अवरुद्ध कर देगा। एक निरंतरता के भीतर से फेंक दिया किसी भी अपवाद को पकड़ने के लिए इसका मतलब यह नहीं कर सकते हैं मैं इस तरह कुछ करने के लिए निश्चित रूप से
Task parentTask = Task.Factory.startNew(() =>
{
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
Task continueTask = asyncTask.ContinueWith(task =>
{
// My continuation stuff...
}
try
{
continueTask.Wait();
}
catch(AggregateException aggEx)
{
// Some handling here...
}
});
यह और भी काम करेगा? यहाँ सबसे अच्छा अभ्यास क्या है?
हमेशा की तरह, अपने समय के लिए धन्यवाद।
मैंने उन कार्यों को देखा है जो "पूरा होने के लिए भाग गए" जब वास्तव में उन्होंने एक समग्र अपवाद फेंक दिया। उस प्रकार की त्रुटि हैंडलिंग काम नहीं करती है। क्यों न केवल कोशिश/पकड़ का उपयोग करें? –
क्या आप पृष्ठभूमि थ्रेड पर या वास्तविक निरंतरता प्रतिनिधि विधि में कहा जाने वाला तरीका है? – MoonKnight