0

私はいくつかのC#スレッドを行っています。スレッドを開始してデータをスレッドに転送することに問題はありませんが、スレッドが終了するのを待つことに問題があります。

私のコードを以下に示します。スレッドが終了するのを待つために使用Join()していますが、何らかの理由でコードが機能しません。

Join()すべてのアクティブなスレッドを呼び出しても、メインスレッド(つまり、forループ)はブロックされません。

私が間違っていることについて何か考えはありますか?

List<Thread> calculationThreads = new List<Thread>();

foreach (string calculation in calculations)
{
    if (calculationThreads.Count < 5)
    {
        Thread calculationThread = new Thread(DoCalculation);
        calculationThreads.Add(calculationThread);

        calculationThread.Start(threadData);
    }
    else
    {
        // Wait for the threads to complete
        foreach (Thread calculationThread in calculationThreads)
        {
            calculationThread.Join();
        }
    }   
}
4

4 に答える 4

2

最初の問題は、elseケースの取り扱いです。すでに5つのスレッドがある場合、コードはスレッドが終了するのを待ちますが、追加しようとしていたタスクは追加されません。そのタスクを破棄して、次のタスクに進みます。

2番目の問題は、リストからスレッドを削除しないことです。したがって、スレッドが5つに達すると、永久に待機します。最初の問題で残りのタスクが破棄されなかった場合、プログラムはロックされてしまいます。

また、作業を続行する前に5つのスレッドすべてが終了するのを待つことで処理時間を無駄にしていますが、それは小さな問題です。

于 2013-02-19T09:03:25.490 に答える
0

開始したスレッドの数を計算し、各スレッドの最後にカウンターを減らすというアプローチをとります。

次に、ループの最初に次のことができます

while(counter >= 5)
{
//Wait
}
于 2013-02-19T08:52:22.510 に答える
0

すべてのスレッドが終了するまで待機する while ループを作成できます。

List<Thread> calculationThreads = new List<Thread>();

foreach (string calculation in calculations)
{
    if (calculationThreads.Count < 5)
    {
        Thread calculationThread = new Thread(DoCalculation);
        calculationThreads.Add(calculationThread);

        calculationThread.Start(threadData);
    }
    else
    {
        // Wait for the threads to complete
        while(calculationThread.Any(x => x.IsAlive)){}
        // Clearing the list
        calculationThread.Clear();
    }   
}

for ループの後にスレッドを保持したい場合は、スレッドを格納するための別のリストが必要です。

于 2013-02-19T08:52:31.643 に答える
0

メソッドに提供する計算の数は?

コードを読むと、4 つの計算を指定すると、4 つのスレッドが開始されますが、実際に thread.Join() を実行するコードには決して移動しません。

thread.join ループを if else ステートメントの外に移動します。

List<Thread> calculationThreads = new List<Thread>();

    foreach (string calculation in calculations)
    {
        if (calculationThreads.Count < 5)
        {
            Thread calculationThread = new Thread(DoCalculation);
            calculationThreads.Add(calculationThread);

            calculationThread.Start(threadData);
        }

    }
    foreach (Thread calculationThread in calculationThreads)
    {
        calculationThread.Join();
    }
于 2013-02-19T08:58:37.307 に答える