异步事件处理程序:深入探讨async void
的使用
虽然普遍认为避免使用“启动即忘”的async void
方法,但问题是:异步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
”规则的例外。这是因为:
但是,在某些情况下,出于以下原因,将异步事件处理程序的逻辑分解可能更有益:
示例:
<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”?的详细内容。更多信息请关注PHP中文网其他相关文章!