应用压力测试错误

时间:2013-02-09 22:06:18

标签: c# multithreading thread-safety

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

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

  1. 我该如何解决这个问题?
  2. 写入的值“Debug.Print(count.ToString());”总是1000 - 为什么?
  3. 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());
    
                }
            }
    
        }
    

3 个答案:

答案 0 :(得分:2)

  1. 停止创建这么多线程。这是非常耗费资源的。相反,请使用Tasks

  2. icaptured variable,这意味着线程都访问原始变量,而不是副本。如果在循环中创建变量的副本,它将按预期工作。

答案 1 :(得分:1)

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

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

当然,请考虑使用任务。

2000是Windows强制执行的功能限制。我认为它可能与分配给每个线程的最小堆栈有关,但我不会打赌我的生活。任务是非常轻量级的线程,在可能的情况下更喜欢它们。

答案 2 :(得分:-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());

    }
}

}