'async void'이벤트 핸들러를 피해야합니까?
async void
작업을 시작 하기 위해 fire-and-forget 메서드 를 사용하는 것은 일반적으로 나쁜 생각으로 간주된다는 것을 알고 있습니다 . 대기중인 작업에 대한 추적이없고 이러한 메서드 내부에서 발생할 수있는 예외를 처리하는 것이 까다로울 수 있기 때문입니다.
일반적으로 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 cancellation
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); // do async work
// ...
}
재진입 가능성 외에 비동기 이벤트 핸들러의 수중 암석은 무엇입니까?
가이드 라인은 이벤트 핸들러에서 사용하는 경우를 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);
}
일반적으로 비동기 무효 이벤트 핸들러도 피해야합니까?
일반적으로 이벤트 핸들러는 void 비동기 메서드가 잠재적 인 코드 냄새가 아닌 경우입니다.
이제 어떤 이유로 작업을 추적해야하는 경우 설명하는 기술이 완벽하게 합리적입니다.
예, 일반적으로 이벤트 핸들러의 비동기 무효가 유일한 경우입니다. 그것에 대해 더 알고 싶다면 여기 채널 9에서 멋진 비디오를 확인하십시오.
The only case where this kind of fire-and-forget is appropriate is in top-level event-handlers. Every other async method in your code should return "async Task".
여기에 링크가 있습니다
ReSharper를 사용하는 경우 무료 추천 확장 프로그램 이 도움이 될 수 있습니다. "async void"메서드를 분석하고 부적절하게 사용 된 경우 강조 표시합니다. 확장은 async void의 다양한 사용법을 구별하고 여기에 설명 된 적절한 빠른 수정을 제공 할 수 있습니다. ReCommended-Extension wiki .
참고 URL : https://stackoverflow.com/questions/19415646/should-i-avoid-async-void-event-handlers
'Programming' 카테고리의 다른 글
`WinMain @ 16 '에 대한 정의되지 않은 참조 (0) | 2020.08.15 |
---|---|
SQLAlchemy ORM을 사용하여 효율적으로 데이터베이스 업데이트 (0) | 2020.08.15 |
노드 모듈에서 멋진 글꼴 아이콘을 사용하는 방법 (0) | 2020.08.14 |
이름이 같은 두 개의 클래스를 가져옵니다. (0) | 2020.08.14 |
JavaScript를 MySQL과 연결할 수 있습니까? (0) | 2020.08.14 |