Я изучал, как использовать пулы потоков, но я не уверен, что каждый из потоков в пуле выполняется правильно, и я подозреваю, что некоторые из них выполняются более одного раза. Я сократил код до минимума и использовал Debug.WriteLine, чтобы попытаться выяснить, что происходит, но это дает некоторые странные результаты.
Мой код выглядит следующим образом (на основе кода из ( WaitAll для нескольких дескрипторов в потоке STA не поддерживается ):
public void ThreadCheck()
{
string[] files;
classImport Import;
CountdownEvent done = new CountdownEvent(1);
ManualResetEvent[] doneEvents = new ManualResetEvent[10];
try
{
files = Directory.GetFiles(importDirectory, "*.ZIP");
for (int j = 0; j < doneEvents.Length; j++)
{
done.AddCount();
Import = new classImport(j, files[j], workingDirectory + @"\" + j.ToString(), doneEvents[j]);
ThreadPool.QueueUserWorkItem(
(state) =>
{
try
{
Import.ThreadPoolCallBack(state);
Debug.WriteLine("Thread " + j.ToString() + " started");
}
finally
{
done.Signal();
}
}, j);
}
done.Signal();
done.Wait();
}
catch (Exception ex)
{
Debug.WriteLine("Error in ThreadCheck():\n" + ex.ToString());
}
}
classImport.ThreadPoolCallBack фактически ничего не делает в данный момент.
Если я пошагово выполняю код, я получаю:
Тема 1 запущена
Тема 2 началась
.... весь путь к ....
Тема 10 запущена
Однако, если я запускаю его вручную, окно «Вывод» заполняется «Тема 10 запущена»
У меня вопрос: что-то не так с моим кодом для использования пула потоков или результаты Debug.WriteLine путаются из-за нескольких потоков?