让我先说一下这个免责声明,我对多线程很陌生,可能会遗漏一些明显的东西。基本的线程池问题
我目前使用下面的代码来处理目录中的所有文件。我的问题是,如果一个线程能够完成,递减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