2011-11-25 43 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); 
    } 
} 

我的問題是關於在上面的代碼中的等待(在while(計數器> 0)) 。這會是一個性能問題嗎?我知道我正在做的多個調用(到遠程Web服務)至少需要幾秒鐘的時間才能返回 - 我是不是應該在while循環中引入像Thread.Sleep()這樣的東西,以便我只檢查所有每季度返回一次左右?

我的直覺是,把線程睡覺到我的代碼有點氣味,但我只是不夠精通這種代碼說方式或其他。

回答

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

異步調用的要點是讓我的多個服務調用(最多五個)並行運行,而不是按順序運行。這將我的等待時間減少到(大約)單個最長的等待時間,而不是等待時間的總和。在我可以繼續下一步之前,我需要返回所有結果。 – Paddy

0

如果你在.NET 4中,你可以,如已經提及的,使用TPL(任務並行庫)。

否則,您必須Reactive Extensions(Rx.NET),其還內置撰寫異步操作起來

如果你不希望在所有使用任何第三方庫,你可以創建一堆ManualResetEvent實例,然後您可以等待使用靜態方法。