我强调测试我的应用程序,并编写了一个简单的测试来生成数百个调用方法的线程。下面的代码适用于1000个线程和100 ms延迟。
在下面的代码中,当线程数为2000,延迟为100个时,错误不能将“below 32.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());
}
}
}发布于 2013-02-09 22:14:45
i是一个捕获变量,这意味着线程都访问原始变量,而不是副本。如果在循环中创建变量的副本,它将按预期工作。发布于 2013-02-09 22:39:18
要处理捕获的变量问题,在循环中执行以下操作:
int x = i;
Thread Trd = new Thread(() => EmptyThreadRequest(int.Parse(radTextBoxFloodDelay.Text), x));当然,考虑使用任务。
2000是Windows强制执行的功能限制。我认为这可能与分配给每个线程的最小堆栈有关,但我不会将我的生命押在它上。任务是很轻的线程,如果可能的话,他们更喜欢线程。
https://stackoverflow.com/questions/14792134
复制相似问题