【问题标题】:This async method lacks 'await' operators and will run synchronously此异步方法缺少“等待”运算符,将同步运行
【发布时间】:2017-04-30 15:49:58
【问题描述】:

我的程序有以下语句的 3 个警告:

此异步方法缺少“等待”运算符,将同步运行。 考虑使用 'await' 运算符来等待非阻塞 API 调用, 或 'await Task.Run(...)' 在后台线程上执行 CPU 密集型工作。

警告试图告诉我什么?我该怎么办?

这是我的代码:它是否使用多线程运行?

static void Main(string[] args)
{
    Task task1 = new Task(Work1);
    Task task2 = new Task(Work2);
    Task task3 = new Task(Work3);

    task1.Start();
    task2.Start();
    task3.Start();

    Console.ReadKey();
}

static async void Work1()
{
    Console.WriteLine("10 started");
    Thread.Sleep(10000);
    Console.WriteLine("10 completed");
}

static async void Work2()
{
    Console.WriteLine("3 started");
    Thread.Sleep(3000);
    Console.WriteLine("3 completed");
}

static async void Work3()
{
    Console.WriteLine("5 started");
    Thread.Sleep(5000);
    Console.WriteLine("5 completed");
}

【问题讨论】:

  • async 并不意味着“多线程”。请参阅我的 intro to async 帖子,了解 async 的作用。
  • @StephenCleary 谢谢,这篇文章非常好,易于理解

标签: c# asynchronous async-await


【解决方案1】:

async 关键字本身并没有多大作用。从您的代码中删除它,您的代码将完全一样。

async 是做什么的?

  • 它改变了方法内部的有效内容,特别是它允许您使用 await 关键字
  • 反过来,这意味着方法的主体将根据方法主体中存在的awaits 进行转换。
  • 如果该方法返回一个值,该方法也会被转换为将返回值包装在一个Task中。

但是,如果您 a) 在您的方法主体中没有任何 awaits 并且 b) 正在返回 void,那么不会有什么特别的结果。编译器警告确实试图澄清这一点 - 没有任何 awaits 的 async 方法只是简单的没有意义。 awaits 是这个功能中比较重要的部分。

【讨论】:

  • 如果只有 async 方法体中的方法是可等待的,并且这个 async 方法在其他地方也与 await 一起使用,那会怎样?最好创建第二个带有延续的方法并将异步方法包装在其中?
【解决方案2】:

如果您使用同步方法覆盖异步方法,您可以:

等待Task.Run(() => [你的同步方法]);

【讨论】:

    【解决方案3】:

    你在方法中使用了'async'关键字,表示Work1()、Work2()和Work3()方法是异步执行的,但是你没有使用'await'关键字。所以它是同步执行的。使用'await' 关键字,如果你想异步执行它。

     static async void Work1()
     {
         Console.WriteLine("10 started");
         await Task.Delay(10000);
         Console.WriteLine("10 completed");
     }
    
     static async void Work2()
     {
         Console.WriteLine("3 started");
         await Task.Delay(3000);
         Console.WriteLine("3 completed");
     }
    
     static async void Work3()
     {
         Console.WriteLine("5 started");
         await Task.Delay(5000);
         Console.WriteLine("5 completed");
     }
    

    【讨论】:

    • 此代码将异步运行,但不等待结果。
    【解决方案4】:

    是的,您的代码可能会使用多线程。但是,如果您只是删除了 async 关键字,它仍然会这样做。由于您没有解释为什么它在那里,我建议将其删除。

    如果你想要一个 async/await 模式,你可以使用 Task.Delay() 但我建议你在使用之前阅读更多关于 async/await 的内容:

    static async void Work3()
    {
        Console.WriteLine("5 started");
        await Task.Delay(5000);
        Console.WriteLine("5 completed");
    }
    

    【讨论】:

      【解决方案5】:

      您使用关键字 async 指定了您的方法(Work1、Work2、Work3),但这些方法中的任何代码都没有使用 await 运算符来调用异步调用。

      【讨论】:

      • 此代码将异步运行,但不等待结果。
      猜你喜欢
      • 2019-09-25
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2019-08-27
      • 2014-02-13
      相关资源
      最近更新 更多