非同步事件處理程序:深入探討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>
透過遵循這些指南,您可以有效地使用非同步事件處理程序,同時減輕潛在風險並確保程式碼的可維護性。
以上是異步事件處理程序:使用`aync void'?的詳細內容。更多資訊請關注PHP中文網其他相關文章!