Assume I have a method that has void
return type and that I need to await
on an operation in this method.
public void someOperation()
{
//dostuff
var res = await someOtherOperation();
//do some other stuff that needs res.
}
When I tried to compile this code I got the error saying someOperation
has to be declare async
. I don't understand why. I understand why it would if the method had a return value, but not here when it's void
. or even in the case when the awaiting operation has no effect on the return value of method.
This has already been asked as a part of this question but I didn't find the answer I was looking for. This guy merely mentions:
The async keyword enables the await keyword. So any method using await must be marked async.
async
keyword enables await
keyword.Asynchronous methods must be marked async
. The async
and await
keywords are paired together, primarily for backwards-compatibility reasons; await
was a valid identifier (not a keyword), so when it was added to the language, they also added the async
keyword.
Alternatively, they could have gone with a multi-word keyword for await
, such as await for
. However, the language design team decided to go with the pairing, since it clearly and explicitly marks all async
methods - it's easier for both compilers and humans to parse.
I have a blog post on the subject, with links to Eric Lippert's definitive blog post as well as discussions in blog comments, Channel9 forums, MSDN forums, and of course right here on Stack Overflow.
Note that the natural return type of an async
method without a result value is Task
, not void
. void
is an unnatural return type for async
methods. So your default reaction when seeing the "await operator must be within an async method" error should be to mark it async
and change the return type from void
to Task
:
public async Task someOperationAsync()
{
//dostuff
var res = await someOtherOperationAsync();
//do some other stuff that needs res.
}
This follows one of the best practices in my MSDN article on the subject: avoid async void
. async void
was allowed by the language designers for event handlers (or code that is logically an event handler, like ICommand.Execute
); any other usage is going to cause problems.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With