【发布时间】:2016-03-05 17:48:08
【问题描述】:
在 C# 中,当您覆盖一个方法时,允许在原始方法不是时使覆盖异步。这似乎是一种糟糕的形式。
让我想知道的问题是:我被请来协助解决负载测试问题。在大约 500 个并发用户时,登录过程将分解为重定向循环。 IIS 正在记录异常,并显示消息“异步模块或处理程序已完成,而异步操作仍处于挂起状态”。一些搜索让我认为有人在滥用async void,但我通过源快速搜索什么也没找到。
可悲的是,我正在寻找 async\s*void(正则表达式搜索),而我应该寻找更像 async\s*[^T] 的东西(假设 Task 不完全合格..你明白了)。
我后来在基本控制器中发现了async override void onActionExecuting。显然,这一定是问题所在,而且确实如此。修复该问题(暂时使其同步)解决了问题。
但它给我留下了一个问题:当调用代码永远无法等待它时,为什么你可以将覆盖标记为异步?
【问题讨论】:
-
async void 是事件处理程序的正确模式。只是不要忽视警告。
-
不是元数据,而是programmers.SE。
-
我投票决定将此问题作为题外话结束,因为 - 基于我重新发布到 Programmers.SE 的 cmets:programmers.stackexchange.com/questions/311870/…
-
我不认为这个问题是题外话。了解
async不是方法签名的一部分是重要的编程知识。即使它是题外话,你也不应该交叉发布它。 -
@PeterLaCombJr。
async的重点是允许您在方法的 inside 中使用await。这并不意味着您的异步方法本身必须等待。所以不能等待异步方法不是问题
标签: c# async-await