c# - 为什么 "async void"方法会同步运行?

标签 c# asynchronous async-await

Here埃里克·利珀特说:

A void returning async method cannot be awaited; it is a "fire and forget" method. It does work asynchronously...

它确实是异步工作的吧?

为了对此进行测试,我制作了一个 Windows 窗体应用程序并处理了一个任意事件。在 handler 内部,我开始了繁重的计算。显然,它阻止了 UI 响应:

this.KeyPress += Form1_KeyPressed;
....
private async void Form1_KeyPressed(object sender, EventArgs e)
{
   for(int i=0; i<int.max; i++)
      ;
}

我在 Eric 的回答中遗漏了什么?

最佳答案

What am I missing in Eric's answer?

我的意思是它像任何其他异步方法一样工作。当您在异步方法中等待某些内容时,该方法的其余部分将被注册为等待内容的延续。无论异步方法是否为 void 都是如此。

在您的示例中,您的代码的工作方式与返回任务的异步方法完全一样。尝试更改您的方法以返回任务,您会发现它的行为完全相同。

请记住,“异步”并不意味着“我在另一个线程上并发运行”。这意味着“该方法可能会在其操作完成之前返回”。在其 Action 完成之前它可能返回的点被标记为“等待”。您还没有用“等待”标记任何内容。

我怀疑您相信异步需要并发的神话。重申一遍:异步只是意味着一个方法可以在其工作完成之前返回。你开始煮鸡蛋,门铃响了,你去门廊拿包裹,煮完鸡蛋,打开包裹。 “煮鸡蛋”和“取邮件”工作不是并发——您永远不会同时完成它们。它们是异步的

关于c# - 为什么 "async void"方法会同步运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33731376/

相关文章:

node.js - 解密 aws kms key 时出现 Nodejs 异步问题

javascript - 使用 Promise.all 等待没有生效

c# - 等待新任务 <T>( ... ) : Task does not run?

c# - 具有通用基类的装饰器

c# - 适用于 .Net 4.7.2 的 Roslyn

c# - 数组中出现次数最多的数

javascript - 带有嵌套 For 循环的进度条

C# 从月份字符串中获取月份 INT

javascript - 访问传递给回调的变量

asynchronous - 异步/等待模式和延续之间的关系是什么?