讓我先說一下這個免責聲明,我對多線程很陌生,可能會遺漏一些明顯的東西。基本的線程池問題
我目前使用下面的代碼來處理目錄中的所有文件。我的問題是,如果一個線程能夠完成,遞減numFilesLeft
,並且發現它等於0,因爲下一個項目還沒有被添加爲工作項目,而不是因爲所有文件都已被處理?如果這是可能的,那麼確定它不會發生的標準方法是什麼?
謝謝你的時間。
List<Bar> bars = new List<Bar>();
int numFilesLeft = 0;
ManualResetEvent isWorkDone = new ManualResetEvent(false);
foreach (string dirName in Directory.GetDirectories(@"c:\Temp"))
{
foreach (string file in Directory.GetFiles(dirName))
{
string temp = file;
Interlocked.Increment(ref numFilesLeft);
ThreadPool.QueueUserWorkItem(delegate
{
try
{
List<Bar> results = Process(File.ReadAllText(temp));
if (results.Count > 0)
{
lock (bars) bars.AddRange(results);
}
}
finally
{
if (Interlocked.Decrement(ref numFilesLeft) == 0)
{
isWorkDone.Set();
}
}
});
}
}
isWorkDone.WaitOne();
isWorkDone.Close();
謝謝。這似乎是一個很好的解決方案。 – Ryan 2010-07-10 00:41:14