2

私は、データを抽出する大きなディレクトリで実行され、言語コード(ディレクトリ内のファイルの最初のレベル)ごとにスレッドを開始するツールを作成しています。ツールがデッドロック状態に陥っていたため、すべてのスレッドが終了するまでスレッドがデータベースに追加されないようにするループを追加しました。ただし、このデータをテストする場合、テストデータが静的であっても、DBは間違った量の言語を格納しています。たとえば、私は67の言語を持っていますが、私のDBには48の言語しかありません。問題は、スレッドが停止する前にプログラムの進行を停止するためのループが壊れている可能性があることだと思います。すべてのスレッドが停止する前にDBにファイルを追加しているため、途中で言語が失われます。誰かが同様の問題に遭遇した、またはこの問題を解決する方法を知っているとは思いませんか?ありがとう。

 //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
            }
        }
4

1 に答える 1

2

何よりもまず、パスのローカルコピーを作成し、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);
}

2番目:カスタム待機コードを使用する代わりに、スレッドで使用します。Join

// wait for all threads to complete before proceeding
foreach (Thread thread in threads)
{
    thread.Join();
}

最後に、データベースに競合がないことを確認します。何が行われているのかについてのさらなる情報がなければHBScanner、この問題を引き起こしている可能性のあるものについて他に何も言うことは困難です。

于 2013-02-05T16:00:44.360 に答える