我有什麼,我認爲是一個很常見的線程的情景:線程隊列傻瓜
- 我有100頁相同的作業完成
- 所有作業是相互獨立的各個 其他
- 我要處理同時
- 由於每個作業 完成最多的 15的工作,新的工作將開始 ,直到所有的工作已經完成
如果您假設每個作業在他完成時(我使用BackgroundWorker類)都會觸發一個事件,我可以想到幾種方法來解決這個問題,但我不確定「正確「的解決方案是。我希望你們中的一些專家能指出我的方向。
解決方案1:有一個while(continue){Threading.Sleep(1000);在我的Main()函數中循環}。當Job_Completed事件處理程序中的代碼將設置continue = false時A)沒有作業剩餘排隊和B)所有排隊的作業已完成。我之前和之後都使用過這個解決方案,看起來工作正常......對我來說似乎有點「奇怪」。
解決方案2:在我的Main()函數中使用Application.Run()。同樣,Job_Completed事件處理程序中的代碼會在A)沒有作業保留排隊時,調用Application.Exit(),並且B)所有排隊的作業都已完成。解決方案3:使用ThreadPool,排隊所有500-1000個請求,讓他們一次運行10個(SetMaxThreads),並以某種方式等待它們全部完成。
在所有這些解決方案中,基本思想是每次完成另一項工作時都會開始一項新工作,直到沒有剩餘工作。所以,問題不僅在於等待現有的工作完成,而且還在等待直到不再有待處理的工作開始。如果ThreadPool是正確的解決方案,那麼等待ThreadPool完成所有排隊項目的正確方法是什麼?
我想我最重要的困惑在於,我不明白HOW事件是否能夠從我的Main()函數中觸發。顯然他們這樣做,我只是不明白從Windows消息循環的角度來看它的機制。解決這個問題的正確方法是什麼?爲什麼?
看起來大多數建議都圍繞着一個ThreadPool風格的解決方案......我上面提出的解決方案1和解決方案2(基本上等待被正在觸發的事件修改的條件)呢?這樣做是否有內在的錯誤,還是僅僅是因爲.NET提供了ThreadPool,所以它沒有必要? 看起來很奇怪的代碼是這樣的: while(continue) Threading.Sleep(1000); ...等待事件在Main()函數中觸發。在像這樣的代碼中......當我的事件得到處理時......在Sleep()調用中的某個地方? – 2009-04-28 15:10:55