2014-02-24 3 views
1

시작하는 동안 응용 프로그램에서 두 세트의 데이터를 가져와야하며 각각 비동기 메서드가 있습니다. 내가 하나씩 전화하면 두 번째 전화는 첫 번째 전화가 끝난 후에 만 ​​전달됩니다.여러 비동기 메서드를 연속해서 호출하는 것이 맞습니까?

List<DataOne> DataCollectionOne; 
List<DataTwo> DataCollectionTwo; 

async void GetDatas() 
    { 
     if(sameCondOne) 
     DataCollectionOne = await GetDataOne(); 
     if(sameCondTwo) 
     DataCollectionTwo = await GetDataTwo(); 
    } 

그래서 작업 호출로 랩핑했습니다.

void GetDatas() 
    { 
     if(sameCondOne) 
     Task.Run(() => RunDataOne()); 
     if(sameCondTwo) 
     Task.Run(() => RunDataTwo()); 
    } 

async void RunDataOne() 
    { 
     DataCollectionOne = await GetDataOne(); 
    } 

async void RunDataTwo() 
    { 
     DataCollectionTwo = await GetDataTwo(); 
    } 

내가 제대로하고 있니?

답변

3

첫째, 당신은 무효 반환 async 방법 (Best Practices in Asynchronous Programming)을 피해야한다.

비동기 (또는 TaskAsync비동기 접미사 방법이 이미 존재하는 경우)로 async 방법을 접미사하는 일반적인 방법입니다.

올바르게 이해하면 조건부 비동기 상호 의존 태스크를 생성하고 모든 태스크가 기다리지 않고 모든 태스크가 종료되기를 기다리는 것이 좋습니다. 당신이 매기고 방식의 작업의 결과에 아무것도되지만 일부 부작용을 istead 필요하기 때문에

, 나는 포장 것 받기 ~ 실행에 방법 ~ 방법 당신이했던 것처럼.

당신은 실행 ~ 방법 내부의 상태를 테스트 할 수 있습니다 (명시 적 상태를 테스트하거나 매개 변수로를 가짐으로써) :

async Task RunDataOneAsymc() 
{ 
    if (sameCondOne) 
    { 
     DataCollectionOne = await GetDataOneAsync(); 
    } 
} 

그러나 조건이 거짓이면이 여전히 불필요한 작업을 산란 것 . 그래서, 발신자 측에서 보관하는 것이 좋습니다 :

async Task RunAll() 
{ 
    var tasks = new List<Task>(); 

    if (sameCondOne) 
    { 
     await RunDataOneAsymc(); 
    } 

    // ... 

    if (sameCondN) 
    { 
     await RunDataNAsymc(); 
    } 

    await Task.WhenAll(tasks); 
} 
9

아니오 두 가지 비동기 작업을 시작하기 만하면 새 스레드를 필요로하지 않으며 스핀 업하지 않으려합니다. 당신이 그 (것)들에게 시작 때까지 간단하게 두 작업을 시작하고 기다리고하지 않는다 (이 방법은 작업을 시작하는 것입니다 호출) 두 곳 : 단지 조건부 다음 작업을 시작하고 조건 점검을 처리하기 위해

var firstTask = GetDataOne(); 
var secondTask = GetDataTwo(); 

var firstResult = await firstTask; 
var secondResult = await secondTask; 

조건부 지정 결과 : 모든

Task<T> firstTask = null; 
if(shouldGetFirstTask) 
    firstTask = GetDataOne(); 
Task<T> secondTask = null; 
if(shouldGetSecondTask) 
    secondTask = GetDataTwo(); 

if(firstTask != null) 
    DataCollectionOne = await firstTask; 
if(secondTask != null) 
    DataCollectionTwo = await secondTask; 
+0

:

async Task RunDataOneAsymc() { DataCollectionOne = await GetDataOneAsync(); } // ... if (sameCondOne) { await RunDataOneAsymc(); } 

orchestating 방법에 조건이 참하고 완료하기 위해 그들 모두를 기다릴 경우, 당신은 작업을 산란합니다 고맙습니다. 두 번째 옵션은 동일한 작업 인 경우에도 작동합니다. 나는 다른 일을한다. 둘째, 컬렉션은 일부 조건으로 채워집니다. 문제를 해결하기 위해 약간의 문제가 있습니다. – georgeci

관련 문제