Development Tip

비동기 람다를 기다릴 수 없습니다

yourdevel 2020. 12. 1. 19:50
반응형

비동기 람다를 기다릴 수 없습니다


이걸 고려하세요,

Task task = new Task (async () =>{
    await TaskEx.Delay(1000);
});
task.Start();
task.Wait(); 

task.Wait () 호출은 작업 완료를 기다리지 않고 다음 줄이 즉시 실행되지만 비동기 람다 식을 메서드 호출로 래핑하면 코드가 예상대로 작동합니다.

private static async Task AwaitableMethod()
{
    await TaskEx.Delay(1000);    
}

그런 다음 (svick의 의견에 따라 업데이트 됨)

await AwaitableMethod(); 

람다 예제에서를 호출 task.Wait()하면 반환되는 지연 작업이 아니라 생성 한 새 작업을 기다리고 있습니다. 원하는 지연을 얻으려면 결과 작업도 기다려야합니다.

Task<Task> task = new Task<Task>(async () => {
    await Task.Delay(1000);
});
task.Start();
task.Wait(); 
task.Result.Wait();

새 태스크를 구성하는 것을 피하고 두 개 대신 하나의 태스크 만 처리 할 수 ​​있습니다.

Func<Task> task = async () => {
    await TaskEx.Delay(1000);
};
task().Wait();

을 사용해야 TaskEx.RunEx합니다.

내부 작업을 내부적으로 대기하여 기본적으로 실행 async메서드를 지원합니다 TaskPool. 그렇지 않으면 외부 작업 만 기다리고있는 문제에 직면하게되는데, 이는 분명히 즉시 완료되고, 여전히 대기해야하는 작업을 남겨 두거나, 귀하의 경우 (더 나쁜 경우) 불가능한 빈 람다를 남깁니다. 기다렸다.

또는 외부 작업을 올바르게 구성하면 작업을 두 번 기다릴 수 있습니다 (현재는 그렇지 않습니다).

현재 코드 (고정) :

Task task = new Task<Task>(async () =>{
    await TaskEx.Delay(1000);
});

task.Start();
var innerTask = await task;
await innerTask;

TaskEx.RunEx 사용 :

Task task = TaskEx.RunEx(async () =>{ // Framework awaits your lambda internally.
    await TaskEx.Delay(1000);
});

await task;

참고 URL : https://stackoverflow.com/questions/13046096/can-not-await-async-lambda

반응형