What is the difference between these two functions in terms of what happens within them when they are called?
DoSomething1
is a synchronous method. As such:
- It starts an asynchronous delay and then ignores it.
- Any exceptions from the asynchronous delay are silently ignored.
- Any exceptions from
DoSomething
are raised directly to the caller.
DoSomething2
is an asynchronous void
method. As such:
- It starts an asynchronous delay and then observes it.
- Any exceptions from the asynchronous delay are re-raised on the
SynchronizationContext
that was current at the time DoSomething2
started executing. This generally results in program termination.
- Any exceptions from
DoSomething2
are also raised on that SynchronizationContext
, with the same result.
What is the purpose of using an async method that does not return a Task?
async void
is not a natural thing. For example, the equivalent simply does not exist in F#. async void
was added to C#/VB to enable event handlers to become asynchronous without changing the entire event handling or delegation system.
In short, you should avoid async void
, and only use them for event handlers (or logical equivalents to event handlers, like ICommand.Execute
in MVVM).