这种异步方法缺少"等待"运算符并将同步运行

mjb*_*mjb 8 c# asynchronous async-await

我的程序有以下声明的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");
}
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 6

该async关键字,其本身并没有真正做多。从您的代码中删除它,您的代码将完全相同。

怎么async办?

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

但是,如果您a)await方法体中没有任何s并且b)void返回,那么将不会实现任何特殊操作。编译器警告确实试图澄清这一点-一种async没有任何await意义的方法毫无意义。await是此功能的更重要部分。


jig*_*esh 5

您在方法中使用了 ' 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");
 }
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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