1

我正在对我的应用程序进行压力测试,并编写了一个简单的测试来生成数百个调用方法的线程。下面的代码适用于 1000 个线程和 100 毫秒延迟。

在下面的代码中,当线程数为 2000 且延迟为 100 时,我收到错误无法在 radButtonEmptyThread_Click 的 catch 语句中将“shell32.dll”DLL 加载到内存中

  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

要处理捕获的变量问题,请在循环内执行以下操作:

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

当然,考虑使用任务。

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 回答