2 가지 시나리오 중에서 어느 것이 C#에서 비동기 프로그래밍을 수행하는 올바른 방법입니까?비동기 - 올바른 것 중 어느 것입니까?
시나리오 1 다음
public async Task<T1> AddSomethingAsync(param)
{
return await SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}
List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
Tasks.Add(AddSomethingAsync(task));
}
await Task.WhenAll(Tasks.AsParallel());
시나리오 2 다음
public async Task<T1> AddSomethingAsync(param)
{
return SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}
,
List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
Tasks.Add(SomeOtherFunctionFromThirdPartyLibraryForIOAsync(task));
}
await Task.WhenAll(Tasks.AsParallel());
2의 유일한 차이점은 나중에 await
키워드가 AddSomethingAsync
내부에 없기 때문입니다.
여기 업데이트가 있습니다 - 내가 알고 싶은 것은 모든 작업이 병렬 및 비동기 적으로 실행되어야한다는 것입니다. 시나리오 1에서 통화가 AddSomethingAsync 내부 기다려온되고 실행 다음 루프를 차단하는 상위 계층에 상처를한다 (내 생각이다. 확인 후
'Tasks.AsParallel'? 나는 당신이'AsParallel'이 무엇인지 알지 못한다고 생각합니다. 'await Task.WhenAll (Tasks);를 사용하십시오. 함수가 진정으로 비동기가 아니더라도 'AsParallel'은 파티에 너무 늦을 것입니다. – Luaan
@Luaan, "늦은 파티"에 대해 더 많은 생각을 나눌 수 있습니까? –
열거 형에 대해 'AsParallel'을 호출하고 열거하면 아무 것도 병렬 처리하지 않습니다. PLINQ는 생성하는 데이터가 게으른 경우에만 당신을 도울 수 있습니다 - 당신의 경우 모든 작업이 이미 완료되었습니다 ('AddSomethingAsync' 호출). – Luaan