Есть метод для отсечки по времени выполнения асинхронной задачи, выглядит он вот так:
internal static async Task TimeoutAfter(Task task, int timeout)
{
using (var timeoutCTS = new CancellationTokenSource())
using (var timeoutTask = Task.Delay(timeout, timeoutCTS.Token))
using (var completedTask = await Task.WhenAny(task, timeoutTask))
{
if (completedTask == task)
{
timeoutCTS.Cancel();
await task;
}
else
throw new TimeoutException("The operation has timed out.");
}
}
В конструкторе формы создана подписка на обработку TaskScheduler.UnobservedTaskException.
Суть проблемы: если переданная в метод задача создает исключение, оно пробрасывается в UnobservedTaskException. До применения этого метода подобного поведения не наблюдалось. Пришлось, на время, использовать заглушку в виде:
TaskScheduler.UnobservedTaskException += (s, args) =>
{
args.SetObserved();
};
Вопрос: почему происходит проброс исключений в UnobservedTaskException и как корректно выйти из ситуации?
Update: если заключить метод, в котором вызывается TimeoutAfter, в блок try\catch - то исключение всеравно пробрасывается в UnobservedTaskException.
Продвижение своими сайтами как стратегия роста и независимости