2016-11-08 8 views
-1

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 내부 기다려온되고 실행 다음 루프를 차단하는 상위 계층에 상처를한다 (내 생각이다. 확인 후

+3

'Tasks.AsParallel'? 나는 당신이'AsParallel'이 무엇인지 알지 못한다고 생각합니다. 'await Task.WhenAll (Tasks);를 사용하십시오. 함수가 진정으로 비동기가 아니더라도 'AsParallel'은 파티에 너무 늦을 것입니다. – Luaan

+0

@Luaan, "늦은 파티"에 대해 더 많은 생각을 나눌 수 있습니까? –

+3

열거 형에 대해 'AsParallel'을 호출하고 열거하면 아무 것도 병렬 처리하지 않습니다. PLINQ는 생성하는 데이터가 게으른 경우에만 당신을 도울 수 있습니다 - 당신의 경우 모든 작업이 이미 완료되었습니다 ('AddSomethingAsync' 호출). – Luaan

답변

6

시나리오 3

public 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); 

아무것도 기다리지 않으려면 async 키워드가 필요하지 않습니다.이 경우에도 AsParallel을 사용하면 아무 일도하지 않습니다.

-1

제 의견으로는 동일합니다. await은이 메서드가있는 동일한 스레드에서이 줄을 실행한다는 의미의 표시입니다. 스레드에서 기다리고 있습니다.
사실 asyncawait은 return void 메소드를위한 디자인입니다. 이 메소드가 결과를 돌려주지 않는 경우는, thread만으로 처리 할 수 ​​있습니다. 어떤 async 메서드는이 메서드를 호출하면 void 메서드와 동일한 스레드를 사용한다는 것을 의미합니다. 스레드 하위 메서드 결과가 await이면이 스레드 내부에서 대기합니다.
그리고 이것을 List<Task>에 넣으면 아무런 차이가 없습니다.

+0

현재 메서드는 객체를 반환하지만 아무 소용이 없습니다. –

+0

당신은'async & await'을 어떤 상황에서 사용해야하는지 이해할 필요가 있습니다. 나는 [여기] (http://www.cnblogs.com/xianyudotnet/p/5716908.html)에 블로그를 썼다. 바로 Async & await & Task 부분으로 건너 뛸 수있다. 영어가 아니지만, 실험 결과 또는 Google에 의해 번역. – Bucketcode