首页 > 后端开发 > C++ > 您应该避免使用 Async Void 事件处理程序吗?

您应该避免使用 Async Void 事件处理程序吗?

Patricia Arquette
发布: 2025-01-26 02:46:09
原创
814 人浏览过

Should You Avoid Async Void Event Handlers?

async void 事件处理程序:该不该避免?

一般来说,最佳实践建议避免使用 async void 方法,尤其是在启动任务时,因为它们缺乏跟踪挂起任务的机制,并且异常处理较为复杂。但是,这个原则是否也适用于 async void 事件处理程序呢?

让我们来看一个例子:

<code class="language-csharp">private async void Form_Load(object sender, System.EventArgs e)
{
    await Task.Delay(2000); // 执行异步操作
    // ...
}</code>
登录后复制

与其使用这种方法,不如重新设计代码来实现任务跟踪和取消功能:

<code class="language-csharp">Task onFormLoadTask = null; // 跟踪任务,可以实现取消

private 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); // 执行异步操作
    // ...
}</code>
登录后复制

除了潜在的重入问题外,async void 事件处理程序还有什么隐藏的陷阱?

关键在于,async void 的使用在无法优雅地处理异常的上下文中是被劝退的。然而,在事件处理程序中,异常会被路由到全局异常处理程序,确保它们被适当地捕获和处理,无需在事件处理程序本身进行显式错误处理。这就是使 async void 在这种特定情况下可以接受的关键区别。

为了进行单元测试,通常的做法是提取所有 async void 方法的逻辑以进行隔离:

<code class="language-csharp">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);
}</code>
登录后复制

总之,虽然通常不建议使用 async void 方法,但在 async void 事件处理程序中使用它们是可以接受的,因为事件处理程序框架具有固有的异常处理机制。因此,您可以在事件处理程序中使用 async void 而不会违反最佳实践。

以上是您应该避免使用 Async Void 事件处理程序吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板