【问题标题】:Compiler warning about async shouldn't happen不应该发生关于异步的编译器警告
【发布时间】:2020-06-18 18:15:19
【问题描述】:

所以下面的代码会触发编译器警告:

"没有 await 操作符的异步函数会同步运行"

    public async Task UpsertMariaDb()
    {
        IEnumerable<Task> insertTasks = InsertSomethingDb();
        IEnumerable<Task> updateTasks = UpdateSomethingDb();

        Task.WaitAll(insertTasks.ToArray());
        Task.WaitAll(updateTasks.ToArray());
    }

我的问题如下,关于 async/await 是否有一些我不了解的非常基本的东西,或者这只是一个编译器警告错误,因为我没有明确地“await

【问题讨论】:

  • 您应该在标记为async 的方法中使用await 关键字。如果您只是调用Task.Wait...,则不需要将方法标记为async
  • 您的意思是使用await Task.WhenAll()(异步)而不是Task.WaitAll()(同步)吗?

标签: c# .net-core async-await compiler-warnings


【解决方案1】:

Task.WaitAll 阻塞了当前线程,因此警告是正确的 - 您尝试实现异步方法,但它不是异步的,因为没有任何等待。

你可能打算这样做:

public async Task UpsertMariaDb()
{
    IEnumerable<Task> insertTasks = InsertSomethingDb();
    IEnumerable<Task> updateTasks = UpdateSomethingDb();

    await Task.WhenAll(insertTasks);
    await Task.WhenAll(updateTasks);
}

【讨论】:

  • 感谢您将我的评论转化为实际答案。 :)
  • 对不起,当我已经开始输入我的答案时你的评论出现了,所以我想我还是应该继续;)
  • 你可以去掉.ToArray(),这是多余的。 Task.WhenAll 有一个接受 IEnumerable&lt;Task&gt; 的重载。
  • 感谢@JohnathanBarclay 的提示,我相应地编辑了我的帖子;)
猜你喜欢
  • 1970-01-01
  • 2011-11-23
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多