为了账号安全,请及时绑定邮箱和手机立即绑定

我应该避免'async void'事件处理程序吗?

我应该避免'async void'事件处理程序吗?

千万里不及你 2019-07-26 17:04:55
我应该避免'async void'事件处理程序吗?我知道使用fire-and-forget async void方法来启动任务通常被认为是一个坏主意,因为没有跟踪任务的跟踪,处理可能在这种方法中抛出的异常是很棘手的。我一般应该避免使用async void事件处理程序吗?例如,private async void Form_Load(object sender, System.EventArgs e){         await Task.Delay(2000); // do async work         // ...}我可以像这样重写它:Task onFormLoadTask = null; // track the task, can implement cancellationprivate void Form_Load(object sender, System.EventArgs e){         this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);} private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e){         await Task.Delay(2000); // do async work         // ...}除了可能的重入之外,异步事件处理程序的水下岩石是什么?
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

async void 除了在事件处理程序中使用时,指南是要避免的,因此async void在事件处理程序中使用是可以的。

也就是说,出于单元测试的原因,我经常想要分析所有async void方法的逻辑。例如,

public async Task OnFormLoadAsync(object sender, EventArgs e){
  await Task.Delay(2000);
  ...}private async void Form_Load(object sender, EventArgs e){
  await OnFormLoadAsync(sender, e);}


查看完整回答
反对 回复 2019-07-26
?
慕神8447489

TA贡献1780条经验 获得超1个赞

我一般应该避免异步void事件处理程序吗?

通常,事件处理程序是一种情况,其中void异步方法不是潜在的代码气味。

现在,如果您确实需要出于某种原因跟踪任务,那么您描述的技术是完全合理的。


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 802 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信