Потоки, возвращающие разные значения со статическими данными
Я делаю инструмент, который работает на большой каталог извлечения данных и запускает поток для кода языка (первый уровень файлов в каталоге). Я добавил цикл, который останавливает добавление потоков в базу данных до тех пор, пока все потоки не будут завершены, потому что инструмент без него зашел в тупик. Однако при тестировании этих данных в БД хранится неправильное количество языков, даже если данные теста являются статическими. Например, у меня 67 языков, но в моей БД только 48. Я думаю, что проблема может заключаться в том, что мой цикл остановки программы до остановки потоков может быть прерван, т.е. это добавление файлов в БД до того, как все потоки были остановлены, и таким образом теряются языки. Я не думаю, что кто-то сталкивался с подобной проблемой или знает, как решить эту проблему? Благодарю.
//get the languages from the folders
string[] filePaths = Directory.GetDirectories(rootDirectory);
for (int i = 0; i < filePaths.Length; i++)
{
string LCID = filePaths[i].Split('\\').Last();
Console.WriteLine(LCID);
//go through files in each folder and sub-folder with threads
Thread t1 = new Thread(() => new HBScanner(new DirectoryInfo(filePaths[i - 1])).HBscan());
t1.Start();
threads.Add(t1);
}
// wait for all threads to complete before proceeding
foreach (Thread thread in threads)
{
while (thread.ThreadState != ThreadState.Stopped)
{
//wait
}
}
1 ответ
Прежде всего: создайте локальную копию пути и передайте ее в поток вместо переменной цикла for. Закрытие по переменной цикла считается вредным.
Я не знаю, почему вы получаете индекс вне диапазона исключений, но вы также можете избежать этого, используя foreach
-loop.
//get the languages from the folders
string[] filePaths = Directory.GetDirectories(rootDirectory);
foreach(string filePath in filePaths)
{
Console.WriteLine(filePath.Split('\\').Last());
string tmpPath = filePath; // <-- local copy
//go through files in each folder and sub-folder with threads
Thread t1 = new Thread(() => new HBScanner(new DirectoryInfo(tmpPath)).HBscan());
t1.Start();
threads.Add(t1);
}
Второе: использовать Join
в потоках вместо того, чтобы иметь некоторый пользовательский код ожидания.
// wait for all threads to complete before proceeding
foreach (Thread thread in threads)
{
thread.Join();
}
Наконец, убедитесь, что в базе данных нет конфликтов. Без дополнительной информации о том, что HBScanner
Да, трудно сказать что-либо еще о том, что может быть причиной этой проблемы.