c# async void의 await TaskRun() 실패 볼륨
개시하다
await Task.Run(() => HeavyMethod());
이런 샘플이 자주 보이네요.무심결에 사용했다.사실 이렇게 하면 실패한다.
저는 최근까지 Task였습니다.런으로 싸면 위의 샘플처럼 Heavy Method도Task가 될 수 있다는 오해를 했어요.
나중에 찾아보니 Heavy Method의 내용에 문제가 있어 await를 사용하는 경우 async void는 UI의 이벤트 처리 이외에 사용을 금지합니다.
예를 들어 명령(Start)을 보낸 후 2초 동안 명령(종료)을 기다리는 처리에서 Start~종료 후 다음 처리를 수행하는 조건이 있다면 async void를 사용할 때 기대대로 이동하지 않을 수 있습니다.
아는 사람한테는 그렇게 과장하지 않았을지도 몰라...적어.
async void에서 예상한 동작이 없음
이상의 견본 모방의 결과.
private async void button1_Click(object sender, EventArgs e)
{
for(var i = 0; i < 3; i++)
{
await Task.Run(() => DelayMethodByAsyncVoid(i));
}
}
async void DelayMethodByAsyncVoid(int id)
{
System.Console.WriteLine("Start "+id);
await Task.Delay(2000);
System.Console.WriteLine("End " + id);
}
Start 0
Start 1
Start 2
End 2
End 1
End 0
람다식의 안쪽은 Task입니다.안에 Task 아니야.Task 가 완료된 것 같습니다.Delay MethodByAsyncVoid는 비동기식 동작입니다.
원래 Method라고 불렀는데 Task였어요.런을 사용하는 것이 좋다는 의문도 있다.
람다식에서 쓰기 처리
람다식에서.를 처리하면 모든 처리가 Task로 바뀌어 순조롭게 진행된다.
private async void button2_Click(object sender, EventArgs e)
{
for(var i = 0; i < 3; i++)
{
await Task.Run(async () =>
{
System.Console.WriteLine("Start " + i);
await Task.Delay(2000);
System.Console.WriteLine("End " + i);
});
}
}
Start 0
End 0
Start 1
End 1
Start 2
End 2
async Task 정의아무거나 괜찮아요.Run이 만들었지만 여러 곳에서 불리면 ASync Task로 정의하는 것이 유창하다.
private async void button3_Click(object sender, EventArgs e)
{
for(var i = 0; i < 3; i++)
{
await DelayMethodByTask(i);
}
}
async Task DelayMethodByTask(int id)
{
System.Console.WriteLine("Start "+id);
await Task.Delay(2000);
System.Console.WriteLine("End " + id);
}
Start 0
End 0
Start 1
End 1
Start 2
End 2
작업 환경개발 환경
Visual Studio Community 2017
목표 프레임
.NET Fremawork 4.6.1
Reference
이 문제에 관하여(c# async void의 await TaskRun() 실패 볼륨), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/twentyfourhours/items/3451f39567239f951a1a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)