Предположим, что следующий метод определен:Должен ли я использовать обычную задачу или задачу продолжения?
Task<TResult> DoStuffAsync()
{
// ...
}
Рассмотрим следующий код (сниппета 1):
void MyFunction()
{
Task<TResult> task = DoStuffAsync();
task.ContinueWith(async() => {
TResult result = await task;
// do stuff with result
});
// poll `task` status...
}
по сравнению со следующим кодом (фрагмент 2):
void MyFunction()
{
Task<TResult> task = DoStuffAsync();
Task.Run(async() => {
TResult result = await task;
// do stuff with result
});
// poll `task` status...
}
(Обратите внимание, что меня не волнует статус лямбда-функции (огонь и забухание). Но I do заботиться, если это r . АЙСы любые исключения)
Первое различие между этими двумя вариантами представляется очевидным: в (фрагмент 1) код в лямбда будет только начать выполнение послеDoStuffAsync()
завершена, в то время как в (фрагмент 2) кода в lambda попытается немедленно начать выполнение и продолжить, когда DoStuffAsync()
завершено.
Однако, помимо этой разницы, когда вы должны использовать ContinueWith
и когда вы должны использовать Task.Run
? Что произойдет, если исключение возникает в DoStuffAsync()
или в функции лямбда? Будет ли это проглочено или все потенциальные исключения гарантированно будут подняты до блока, где он может быть обработан?
Во-первых, вы не должны запрашивать статус задачи после запуска. Это довольно большой красный флаг. – Servy
зачем вам это нужно? просто делать результат = ждать DoStuffAsync(); казалось бы, лучший вариант. – ths