c# async void의 await TaskRun() 실패 볼륨

7257 단어 taskC#

개시하다
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

좋은 웹페이지 즐겨찾기