2011-10-04 70 views
1

我有一個循環,我不想繼續,直到LoadAmazonDataByBatch()已返回。我知道必須有一個簡單的方法來做到這一點,而且我幾乎可以肯定我正在接近錯誤的問題。暫停循環,直到內部函數返回(C#)

const int batchSize = 500; 
for (int i = 0; i < total; i = i + batchSize) 
{ 
    LoadAmazonDataByBatch(i, batchSize, fileList, total, amazonLogHandler, stopWatch); 
} 

LoadAmazonDataByBatch()做了一大堆的工作線程,包括創建一個臨時的數據集將獲得沒有配料非常大的事情。我不想創建一個新的DataSet,直到舊的DataSet被處理並處理(通過LoadAmazonDataByBatch)。 很明顯,現在寫的這種方式現在一切幾乎都是同時發生的。

我該如何解決這個問題?

+1

LoadAmazonDataByBatch看起來像什麼?你能改變方法嗎?它有回調嗎?如果該方法沒有給出讓您知道何時完成的方法,那麼它可能是不可能的。如果實現使用QueueUserWorkItem(),則 – Davy8

回答

2

你需要做某種線程同步。

不清楚的地方,你得到了LoadAmazonByBatch(),但我建議

  • 檢查該功能的文檔,看看是否有操作的同步版本。

  • 如果沒有可用的文檔,那麼您將需要捲起袖子。它可能需要查看或修改LoadAmazonByBatch()的來源。查找工人完成時設置的ManualResetEvent。或者,也許有一個常規的.NET事件在完成時由該方法發出。如果這些東西不存在,你需要添加類似的東西。

+0

感謝你的迴應,我實現了'LoadAmazonByBatch()',它在每個調用中使用一個'Task.Factory.StartNew(()=>'來完成它的工作從文件讀取數據,然後保存到數據集,然後加載到SQL) –

+1

好的,那麼你需要決定是否需要異步行爲。工廠允許你在後臺運行,但現在你說*你不需要這樣做*我懷疑在該fn內異步加載有一些好處(特別是異步http請求),所以我建議添加線程同步能力。根據方法參數,在'LoadAmazonByBatch()'內選擇'Task.WaitAll()'。 – Cheeso

+0

我會給這個鏡頭。我在後臺執行此操作以避免掛起UI線程。 –

0

LoadAmazonDataByBatch很可能創建一堆線程。您必須在所有創建的線程上調用Join才能完成。

+0

可能不可行,因爲它應該如此。 – Cheeso

+0

每個LoadAmazon調用使用'Task.Factory.StartNew(()=> {...'做一些工作。 –

+0

然後你需要'Task.Wait()'或'Task.WaitAll()'。 – Cheeso

0

當然,這個不會等待函數返回的唯一方法是,如果它是異步寫入的?

相關代碼不是您發佈的循環,而是我們需要查看的LoadAmazonDataByBatch()的定義。

+1

你是對的,但這更多的是評論而不是答案 – Davy8

0

如果該函數有回調(stopWatch?),也許你可以在回調中調用函數(LoadAmazonDataByBatch)。

0

如果LoadAmazonDataByBatch()生成子線程,並且它運行直到每個線程完成,您可以使用Thread.Join()方法使其等待子線程完成。我不確定這對多個孩子是如何工作的,但我認爲它應該是可以的。

參考:Threading in C#