Обновление
Примечание : вопрос был значительно обновлен с момента получения ответа
Когда При исключении задачи существует небольшая разница в том, как обрабатываются исключения .
См. Блог Стивена Клири о Eliding Asyn c и Await
Лучший способ - просто сделать все это async
. Это позволит поместить исключение в задачу и, в свою очередь, быть брошенным и быть пойманным там, где вы ожидаете
public async Task<decimal> SearchPDFAsync(string searchTerm, CancellationToken cancellationToken)
{
return await Task.Run(() =>
{
decimal result = 0;
// Loop for a defined number of iterations
for (int i = 0; i < 1000; i++)
{
// HERE IS WHERE I'M TOLD THERE IS AN UNHANDLED EXCEPTION
if (cancellationToken.IsCancellationRequested) throw new TaskCanceledException(task);
// since we are async we can use Task.Delay instead of Thread.Sleep
await Task.Delay(10);
result += i;
}
return result;
});
}
Однако, в зависимости от вашей рабочей нагрузки (и от того, связан ли это с процессором), это, вероятно, просто должен быть sync
и task
, запускаемый при вызове метода .
См. Блог Стивена Клири на Примеры этикета Task.Run: Не используйте Task.Run в реализации
Другой (менее красноречивый) Решение состоит в том, чтобы перехватить исключение и поместить его в задачу , при этом будет выдано исключение , когда метод ожидается , и более подробно следует тому, что сгенерированный IAsyncStateMachine
компилятор будет реализовывать при использовании asyn c и шаблона ожидания
public Task<decimal> SearchPDFAsync(string searchTerm, CancellationToken cancellationToken)
{
try
{
return Task.Run(() => {
...
});
}
catch (Exception ex)
{
return Task.FromException<decimal>(ex);
}
}
И, наконец, вам может не потребоваться throw внутри задачи вообще и просто вернуть что-то, что задача отменена .
Обновление 2
Если вы создаете окно автозаполнения, все в порядке, хотя вы также можете посмотреть на Reactive Extensions (RX) , у них есть некоторые отличные расширения для осуждения и регулирования, и многое другое.
Оригинал
Его не ловит, потому что Exception
является ненаблюдаемым из-за вашего Task.Run
. Подумайте об этом, вы просите кого-то выбраться и выполнить задачу , затем уходите и задаетесь вопросом, почему (если у них есть проблема) вы не знаете об этом
task = Task.Run(() =>
Примечание : я неправильно понял код.