비동기 이벤트 핸들러: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!