c# - 在异步函数中,为什么我必须等待?

标签 c# async-await

假设我有这样的方法:

private async Task SomeMethod()
{
  await DoSomethingAsync();
  await DoSomethingElseAsync();
  return;
}

鉴于DoSomethingElseAsync返回 Task看起来你应该能够做到这一点:

private async Task SomeMethod()
{
  await DoSomethingAsync();
  return DoSomethingElseAsync();
}

但是编译器对此有提示:

Since 'SomeMethod' is an async method that returns 'Task', a return keyword must not be followed by an object expression. Did you intend to return 'Task<T>'?

这是为什么?

最佳答案

这很像yield returnreturn作品。对于迭代器,您有这些方法之一

public IEnumerable<int> SomeIterator()
{
    for(int I = 0; I < 10; I++) yield return I;
}

public IEnumerable<int> SomeIterator()
{
    return Enumerable.Range(0, 10); // return result of another iterator.
}

但你不能两者兼得。它不起作用,因为编译器将迭代器转换为类以处理 yield 的惰性迭代,或者它就像其他返回其他内容的普通方法一样。

public IEnumerable<int> SomeIterator() // not valid
{
    for(int I = 0; I < 10; I++) yield return I;
    return Enumerable.Range(0, 10); 
}

关于return的故事是一样的和 async/await .对于返回类型为 Task 的方法你要么返回Task或使用 async/await .

Task<T>如果你使用 await 你必须返回 T但你不能返回 Task<T>因为方法被编译成状态机,那么方法必须返回T . (对于 Task 方法无效)

如果你不使用 async/await方法将与其他普通方法完全一样。

关于c# - 在异步函数中,为什么我必须等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46662428/

相关文章:

c# - 将 CRC C 算法移植到 C#

c# - 在服务总线后面验证过期的 JWT token

c# - 无法将 lambda 表达式转换为类型 "...",因为它不是委托(delegate)类型

c# - 在 Task.WaitAll 中处理取消的任务和任务异常?

c# - 在等待的任务上使用 ContinueWith() 并在内部调用 Task.Result

c# - 如何从单独的程序集中加载 WPF 应用程序资源 "via Code"(不是 "via XAML")

c# - 窗体上的 KeyUp 事件不会运行? C#

wpf - 我应该在UI Thread或Task.Run上使用async等待来处理多个文件吗?

reactjs - Jest 与酵素 |接收值必须是一个函数,接收未定义

c# - 列表的哪个 gridview 触发事件