Methods returning void are not awaitable. await operator can be applied only to methods which are returning Task or Task.
Let's assume that method Bar is async void. Consequences of having method Foo calling method Bar are the following:
https://channel9.msdn.com/Series/Three-Essential-Tips-for-Async/Tip-1-Async-void-is-for-top-level-event-handlers-only
http://blog.stephencleary.com/2014/02/synchronous-and-asynchronous-delegate.html
http://stackoverflow.com/questions/15522900/how-to-safely-call-an-async-method-in-c-sharp-without-await
http://stackoverflow.com/questions/23285753/how-to-await-on-async-delegate
http://stackoverflow.com/questions/20624667/how-do-you-implement-an-async-action-delegate-method
Let's assume that method Bar is async void. Consequences of having method Foo calling method Bar are the following:
- This is a fire and forget model: Foo can't get information when Bar terminates as it can't await on async void method. Foo continues to run before Bar call is completed.
- If Bar throws an exception, Foo can't catch it as there is no Task object to carry the exception object.
For these reasons async void methods shall be avoided. But this rule has a single exception; top-level events (e.g. GUI events) of void type can be async,
Links:
https://channel9.msdn.com/Series/Three-Essential-Tips-for-Async/Tip-1-Async-void-is-for-top-level-event-handlers-only
No comments:
Post a Comment