normal behavior для исключений, отбрасываемых из методов async Task
, заключается в том, чтобы оставаться бездействующими до тех пор, пока они не будут обнаружены позже или пока задача не будет собрана мусором.Сбрасывание немедленно из метода асинхронного метода
Я могу придумать случаи, когда я могу немедленно бросить. Вот пример:
public static async Task TestExAsync(string filename)
{
// the file is missing, but it may be there again
// when the exception gets observed 5 seconds later,
// hard to debug
if (!System.IO.File.Exists(filename))
throw new System.IO.FileNotFoundException(filename);
await Task.Delay(1000);
}
public static void Main()
{
var task = TestExAsync("filename");
try
{
Thread.Sleep(5000); // do other work
task.Wait(); // wait and observe
}
catch (AggregateException ex)
{
Console.WriteLine(new { ex.InnerException.Message, task.IsCanceled });
}
Console.ReadLine();
}
я мог бы использовать async void
, чтобы обойти эту проблему, которая бросает сразу:
// disable the "use await" warning
#pragma warning disable 1998
public static async void ThrowNow(Exception ex)
{
throw ex;
}
#pragma warning restore 1998
public static async Task TestExAsync(string filename)
{
if (!System.IO.File.Exists(filename))
ThrowNow(new System.IO.FileNotFoundException(filename));
await Task.Delay(1000);
}
Теперь я могу обработать это исключение прямо на месте с Dispatcher.UnhandledException
или AppDomain.CurrentDomain.UnhandledException
, по крайней мере, немедленно принесите его вниманию пользователя.
Есть ли другие варианты для этого сценария? Возможно, это надуманная проблема?
Мой голос за надуманную проблему. :) В идеале асинхронный код будет реагировать, поэтому время между сбоем задачи и наблюдением за ошибкой этой задачи должно быть очень коротким. –
Голосовать признано, tks :) – Noseratio