2013-02-09 151 views
1

我压力测试我的应用程序,并编写了一个简单的测试,以产生数百个调用方法的线程。 下面的代码适用于1000个线程和100毫秒的延迟。应用程序压力测试错误

在下面当线程数为2000,延迟为100我的错误 无法将“SHELL32.DLL” DLL加载到内存在catch语句radButtonEmptyThread_Click

  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()); 

      } 
     } 

    } 

回答

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

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

+1

但他为什么会得到那个奇怪的SHELL32错误? – Ameen 2013-02-09 22:17:25

+1

@Ameen我猜这是因为操作系统无法一次处理多个线程。 – 2013-02-09 22:19:03

+0

如果我使用任务将不会得到错误 - 那么Ameens非常有效的问题呢? 2.有道理,但这里的解决方案是什么? – user1438082 2013-02-09 22:20:21

1

为了应付捕获变量的问题,在循环中做到这一点:

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

,当然还有,可以考虑使用任务。

2000是由Windows执行的功能限制。我认为这可能与分配给每个线程的最小堆栈有关,但我不打赌我的生活。任务是非常轻的线程,如果可能的话,更喜欢线程。

+0

完美 - 这么简单,我应该看到... – user1438082 2013-02-09 22:47:01

-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()); 

    } 
} 

}

+0

嗨,为什么-1票? – user1438082 2013-02-09 22:48:29