Let's take a look at this little example.
class Program
{
static void Main(string[] args)
{
try
{
AsyncVoidMethod();
Console.WriteLine("No exception is thrown!");
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
private static async void AsyncVoidMethod()
{
throw new Exception("BOOM!");
}
}
What we have here is a method AsyncVoidMethod,
which throws an exception and returns async void
instead of async Task.
Since it's void, we cannot await
it. What it also means that exception from an async call could not be saved anywhere because there is no Task
object which could save it.
Output
No exception is thrown!
It's a dangerous problem: an exception is not handled!
Solution
I wouldn't like to describe a solution here, because John Thiriet already did a great job doing so, and you know, that duplication is evil, right?
Check this fantastic article for solution:
https://johnthiriet.com/removing-async-void/
Top comments (1)
Hey man! Great subject!
I also created my own component to handle async void and process global error handler, statistic, ...
github.com/roubachof/Sharpnado.Tas...