Позвольте мне предисловие к этому с отказом от ответственности, что я очень новичок в многопоточности и, возможно, что-то не хватает.Basic threadpool question
В настоящее время я использую приведенный ниже код, чтобы обработать все файлы в каталоге. Мой вопрос в том, возможно ли когда-нибудь закончить поток, уменьшится 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