1

私は自分のアプリケーションのストレス テストを行っており、メソッドを呼び出す何百ものスレッドを生成する簡単なテストを作成しました。以下のコードは、1000 スレッドと 100 ミリ秒の遅延で問題なく動作します。

以下のコードで、スレッド数が 2000 で遅延が 100 の場合、radButtonEmptyThread_Click の catch ステートメントでエラー Cannot load the "shell32.dll" DLL into memory が発生します

  1. これを修正するにはどうすればよいですか?
  2. 「Debug.Print(count.ToString());」と書かれた値 は常に 1000 です - なぜですか?

C# コード

private void radButtonEmptyThread_Click(object sender, EventArgs e)
        {
            try
            {

                for (int i = 0; i < int.Parse(radTextBoxWaitThreads.Text); i++)
                {
                    Thread Trd = new Thread(() => EmptyThreadRequest(int.Parse(radTextBoxFloodDelay.Text), i));
                    Trd.IsBackground = true;
                    Trd.Start();
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message.ToString());

            }
        }

        private void EmptyThreadRequest(int delay, int count)
        {

            try
            {

                System.Threading.Thread.Sleep(delay);
                Debug.Print(count.ToString());


            }

            catch (Exception ex)
            {

                MessageBox.Show(ex.Message.ToString());

            }
        }

    }
4

3 に答える 3

2
  1. スレッドをたくさん立てるのはやめましょう。これは非常にリソース集約的です。代わりに、Tasksを使用してください。

  2. iこれは、すべてのスレッドがコピーではなく元の変数にアクセスすることを意味します。ループ内で変数のコピーを作成すると、期待どおりに機能します。

于 2013-02-09T22:14:45.410 に答える
1

To deal with the captured variable issue, inside the loop do this:

int x = i;
Thread Trd = new Thread(() => EmptyThreadRequest(int.Parse(radTextBoxFloodDelay.Text), x));

And of course, consider using Tasks.

2000 は、Windows によって適用される機能制限です。各スレッドに割り当てられた最小スタックと関係があるのではないかと思いますが、それに人生を賭けるつもりはありません。タスクは非常に軽量なスレッドであり、可能な限りスレッドよりも優先されます。

于 2013-02-09T22:39:18.963 に答える
-1

C# コード

private void radButtonCallEmptyTasks_Click(object sender, EventArgs e)
{
    try
    {

        for (int i = 0; i < int.Parse(radTextBoxWaitThreads.Text); i++)
        {

            // Create a task and supply a user delegate by using a lambda expression. 
            var taskA = new Task(() => EmptyTaskRequest(int.Parse(radTextBoxFloodDelay.Text), i));
            // Start the task.
            taskA.Start();
        }
    }
    catch (Exception ex)
    {

        MessageBox.Show(ex.Message.ToString());

    }
}



private void EmptyTaskRequest(int delay, int count)
{

    try
    {

        System.Threading.Thread.Sleep(delay);
        Debug.Print(count.ToString());


    }

    catch (Exception ex)
    {

        MessageBox.Show(ex.Message.ToString());

    }
}

}

于 2013-02-09T22:42:50.767 に答える