繁体   English   中英

此异步方法缺少“等待”运算符,将同步运行

[英]This async method lacks 'await' operators and will run synchronously

我的程序有以下语句的 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关键字本身并没有多大作用。 从您的代码中删除它,您的代码将完全相同。

async什么作用?

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

但是,如果你 a) 在你的方法体中没有任何await并且 b) 是void返回,那么不会有什么特别的东西。 编译器警告确实试图澄清这一点 - 没有任何awaitasync方法只是简单的没有意义。 await是此功能中更重要的部分。

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

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

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

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

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

您使用了“ 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");
 }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM