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/