Всичко, има много въпроси по горната тема, но вярвам, че това е достатъчно различно, за да оправдае нов въпрос. Имам следното Task
и продължение за справяне с различни задачи Status
; TaskStatus.RanToCompletion
, TaskStatus.Canceled
и разбира се AggregateException
през TaskStatus.Faulted
. Кодът изглежда така
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
да бъде хвърлено от продължението - какво тогава?
Не искам да Wait
на моя asyncTask
, нито продължението, тъй като това ще блокира връщането към нишката на потребителския интерфейс. За да уловя всякакви изключения, хвърлени от рамките на продължение, не може да означава, че трябва да направя нещо подобно със сигурност
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...
}
});
това изобщо би ли проработило? Каква е най-добрата практика тук?
Както винаги, благодаря за отделеното време.