반응형
비동기 람다를 기다릴 수 없습니다
이걸 고려하세요,
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
반응형
'Development Tip' 카테고리의 다른 글
벡터를 정의하기 위해 c ()를 사용하는 이유는 무엇입니까? (0) | 2020.12.01 |
---|---|
Java의 ArrayList 또는 List 선언 (0) | 2020.12.01 |
Sublime Text 2에 증가하는 숫자 열을 삽입하는 방법은 무엇입니까? (0) | 2020.12.01 |
numpy 배열 목록을 단일 numpy 배열로 변환하는 방법은 무엇입니까? (0) | 2020.12.01 |
iOS 11 탐색 모음 높이 사용자 지정 (0) | 2020.12.01 |