2013-02-09 120 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