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

时间:2016-12-15 06:03:53

标签: c# asynchronous async-await

我的程序有以下声明的3个警告:

  

这种异步方法缺少'await'运算符并将同步运行。   考虑使用'await'运算符来等待非阻塞API调用,   或'等待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");
}

5 个答案:

答案 0 :(得分:4)

async关键字本身并没有真正起作用。从代码中删除它,您的代码将完全相同。

async做了什么?

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

但是,如果你a)你的方法体中没有任何await并且b)void返回,那么就没有什么特别的了。编译器警告确实试图明确这一点 - 没有任何async的{​​{1}}方法只是简单的没有意义。 await是此功能中更重要的部分。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

您使用了'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 :(得分:0)

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