Await on a completed task same as task.Result?
async-await, asynchronous, c#, task
Solution
There are already some good answers/comments here, but just to chime in...
There are two reasons why I prefer `await` over `Result` (or `Wait`). The first is that the error handling is different; `await` does not wrap the exception in an `AggregateException`. Ideally, asynchronous code should never have to deal with `AggregateException` at all, unless it specifically wants to.
The second reason is a little more subtle. As I describe on my blog (and in the book), `Result`/`Wait` can cause deadlocks, and can cause even more subtle deadlocks when used in an `async` method. So, when I'm reading through code and I see a `Result` or `Wait`, that's an immediate warning flag. The `Result`/`Wait` is only correct if you're absolutely sure that the task is already completed. Not only is this hard to see at a glance (in real-world code), but it's also more brittle to code changes.
That's not to say that `Result`/`Wait` should never be used. I follow these guidelines in my own code:
- Asynchronous code in an application can only use `await`.
- Asynchronous utility code (in a library) can occasionally use `Result`/`Wait` if the code really calls for it. Such usage should probably have comments.
- Parallel task code can use `Result` and `Wait`.
Note that (1) is by far the common case, hence my tendency to use `await` everywhere and treat the other cases as exceptions to the general rule.
Problem
I'm currently reading "Concurrency in C# Cookbook" by Stephen Cleary, and I noticed the following technique: ``` var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask; ``` `downloadTask` is a call to `httpclient.GetStringAsync`, and `timeoutTask` is executing `Task.Delay`. In the event that it didn't timeout, then `downloadTask` is already completed. Why is necessary to do a second await instead of returning `downloadTask.Result`, given that the task is already completed?