When you use async , you cannot explicitly return Task (see edit) - the return value was inserted by the compiler as the return value of Task . Thus, your async methods should behave like other methods and return if they need to break out of the logic first.
EDIT: The only time you can return Task during async is the return type of Task<Task... , however, it will still return an internal Task , not an external one, since the compiler did the same packing. This should also be a fairly rare use case, not await - a thread from Task s
David
source share