2013-02-09 2 views
1

Я испытываю стресс-тестирование своего приложения и написал простой тест, чтобы создать сотни потоков, которые вызывают метод. Приведенный ниже код отлично работает для 1000 потоков и задержки 100 мс.Ошибка теста стресс-теста

В коде ниже, когда количество потоков 2000 и задержка 100 я получаю сообщение об ошибке Не удается загрузить «shell32.dll» DLL в память в заявлении на вылов 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. Stop создания так много потоков. Это очень ресурсоемкий. Вместо этого используйте Tasks.

  2. i является captured variable, что означает, что нити имеют доступ к исходной переменной, а не к копии. Если вы создадите копию переменной внутри цикла, она будет работать как ожидалось.

+1

Но зачем ему получить эту странную ошибку Shell32? – Ameen

+1

@Ameen Я предполагаю, что это потому, что ОС не может обрабатывать сразу несколько потоков. –

+0

если я использую задачи, я не получу ошибки - а как насчет Ameens очень правильный вопрос? 2. имеет смысл, но какое здесь решение? – user1438082

1

Чтобы справиться с захваченным переменным вопросом внутри цикла это сделать:

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

И, конечно, рассмотреть возможность использования задач.

2000 - функциональный предел, установленный Windows. Я думаю, что это может иметь какое-то отношение к минимальному стекю, выделенному для каждого потока, но я бы не стал ставить на него свою жизнь. Задачи - очень легкие потоки, предпочитают их по потокам, когда это возможно.

+0

совершенный - так просто я должен был видеть, что ... – user1438082

-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