我正在对我的应用程序进行压力测试,并编写了一个简单的测试来生成数百个调用方法的线程。 下面的代码适用于1000个线程和100毫秒延迟。
在以下代码中,当线程数为2000且延迟为100时,我得到错误 无法将“shell32.dll”DLL加载到radButtonEmptyThread_Click的catch语句中的内存中
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());
}
}
}
答案 0 :(得分:2)
停止创建这么多线程。这是非常耗费资源的。相反,请使用Tasks。
i
是captured 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());
}
}
}