Потоки, возвращающие разные значения со статическими данными

Я делаю инструмент, который работает на большой каталог извлечения данных и запускает поток для кода языка (первый уровень файлов в каталоге). Я добавил цикл, который останавливает добавление потоков в базу данных до тех пор, пока все потоки не будут завершены, потому что инструмент без него зашел в тупик. Однако при тестировании этих данных в БД хранится неправильное количество языков, даже если данные теста являются статическими. Например, у меня 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 Да, трудно сказать что-либо еще о том, что может быть причиной этой проблемы.

Другие вопросы по тегам