2011-11-25 4 views
1

나는 다음과 같은 의사 코드와 유사한 코드가 있습니다비동기 코딩 - 모든 반환을 기다리고 - 성능

static int counter; 

function GetCalculations() 
{ 
    for (x service calls) 
    { 
      service.BeginCalc(MyCallback); 

      Interlocked.Increment(counter); 
    } 

    while(counter > 0) 
    { 
     //Wait for all results to return 
    } 

    return; 
} 

static function MyCallback() 
{ 
    try 
    { 
    ... process results 
    } 
    finally 
    { 
     Interlocked.Decrement(counter); 
    } 
} 

내 질문은 위의 코드에있는 대기의 관계에있다합니다 (동안 (카운터> 0)) . 이것이 성능 문제일까요? 나는 (원격 웹 서비스에) 다중 호출이 적어도 몇 초가 걸리는 것을 알고있다. while 루프에서 Thread.Sleep()과 같은 것을 도입하는 것이 더 좋을 것이므로 모든 것을 확인하고있다. 4 분의 1 초마다 돌아 왔습니까?

나의 본능적 인 본능은 코드를 잠그는 것이 약간의 냄새가 난다는 것이지만, 나는 이런 식의 코드를 잘 이해하지 못한다.

답변

3

작업 병렬 라이브러리를 사용할 수 있습니다. 그것은 작업 아래

에서 대기 할 수있는 메커니즘을 쉽게 사용할 수있다하는 것은 MSDN에서 예입니다

Task[] tasks = new Task[3] 
    { 
     Task.Factory.StartNew(() => MethodA()), 
     Task.Factory.StartNew(() => MethodB()), 
     Task.Factory.StartNew(() => MethodC()) 
    }; 

//Block until all tasks complete. 
Task.WaitAll(tasks); 
+0

재미있는 독서 용으로 제작되었습니다. 비동기 작업을 사용하여 어떻게 수행했는지에 대해 간략하게 설명 할 때 답을 게시 할 것입니다. 매우 감사합니다. – Paddy

2

비동기 호출이 발생하는 지점이 반환 될 때까지 차단하려는 경우 확실하지 않습니다. GetCalculations()가 진행되기 전에 결과가 필요한 다른 함수에서 호출되는 것처럼 들립니다. 스레드를 차단하는 대신 종속 코드를 자체 함수로 이동하는 방법은 무엇입니까? 그런 다음 콜백에서 해당 함수를 호출하십시오. 모든 콜백이 완료되었는지 확인해야하는 경우 종속 코드가 포함 된 함수를 호출하기 전에 콜백 함수에서 카운터를 확인할 수 있습니다.

+1

비동기 호출의 요점은 내 다중 서비스 호출 (최대 5 개)을 순서가 아닌 병렬로 실행하는 것입니다. 이렇게하면 대기 시간의 합이 아니라 가장 긴 단일 대기 시간 (약)이되는 대기 시간이 줄어 듭니다. 다음 단계로 진행하기 전에 반환 된 모든 결과가 필요합니다. – Paddy

0

는 .NET 4에 있다면 당신이 언급 된 바와 같이, TPL (작업 병렬 라이브러리를 사용할 수를).

그렇지 않으면, 당신은 Reactive Extensions이 (Rx.NET), 또한 모든 제 3 자 라이브러리를 사용하지 않으려면 함께

비동기 작업의 구도를 구축하는, 당신이 ManualResetEvent의 무리를 만들 수 있습니다 그런 다음 정적 메서드 WaitAll을 사용할 때까지 기다릴 수 있습니다.

관련 문제