기존 프로그램을 수정해야하며 다음 코드가 포함되어 있습니다.
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
그러나이 먼저 모든 사용, 나에게 매우 이상한 것 같습니다 async
과 await
선택에. Stephen Cleary 의이 답변 에 따르면 나는 그것들을 떨어 뜨릴 수 있어야합니다.
그런 다음 두 번째 Select
결과를 선택합니다. 이것은 작업이 전혀 비동기식이 아니며 동기식으로 수행되거나 (아무것도 많은 노력을 기울이지 않음) 작업이 비동기식으로 수행되고 완료되면 나머지 쿼리가 실행되는 것을 의미하지 않습니까?
나는에 따라 다음과 같이 위의 코드를 작성해야 스티븐 클리 어리하여 다른 답변 :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
그리고 이것과 완전히 동일합니까?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
이 프로젝트에서 작업하는 동안 첫 번째 코드 샘플을 변경하고 싶지만 비동기 코드 변경 (거의 작동)에 너무 열중하지 않습니다. 어쩌면 나는 아무것도 걱정하지 않고 3 개의 코드 샘플이 모두 똑같은 일을합니까?
ProcessEventsAsync는 다음과 같습니다.
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
와 InputResult
사용자 정의 클래스 인.
Select
이전의 작업 결과를 잊어 버렸습니다 Where
.
Result
작업의 속성을