【发布时间】:2012-07-14 02:59:06
【问题描述】:
如果我在 WinForms 应用程序中设置 ThreadPool.SetMaxThreads,此设置是否仅适用于工作项或整个程序集线程,如计时器和 gui 更新?
我正在构建一个应用程序,它将持续处理半短操作,通常每个操作大约 1 分钟。我首先想出了一个可以正常工作的手动线程创建版本。因为我正在为每个操作创建一个新线程,所以我正在寻找是否可以创建一个更快、更高效的版本,并且我尝试了 ThreadPool,它的效果并不好,它甚至阻止了我的计时器和 gui 更新。这是正常的还是我用错了?
这是我的伪代码:
Manual Thread 版本:(所有MaxThread 和ThreadCount 的读写都是用锁完成的)
timer1.Tick += Tick();
private void Tick()
{
//do some text logging
//do some TextBox updating
}
int MaxThreads = 10
while(true)
{
if(ThreadCount < MaxThreads)
{
new Thread(() => Process()).Start();
ThreadCount++;
}
else
{
Thread.Sleep(10000);
}
}
private void Process()
{
//do something
ThreadCount--;
}
ThreadPool 版本:(电脑为双核 Xeon 32bit Windows server OS)
timer1.Tick += Tick();
private void Tick()
{
//do some text logging
//do some TextBox updating
}
ThreadPool.SetMaxThreads(10,10) **<--removing this didn't help with freezing at all**
while(true)
{
if(ThreadPool.GetAvailableThreads() > 0)
{
ThreadPool.QueueWorkItem(Process, null)
}
else
{
Thread.Sleep(10000);
}
}
private void Process()
{
//do something
}
【问题讨论】:
-
Thread.Sleep(10000)行让我很困惑。在什么情况下调用它? edit 我问的原因是因为它似乎让 GUI 线程休眠。 -
Zanathel:有 Thread.Sleep 行的方法在自己的线程中运行,而不是在 gui 线程上。
标签: c# winforms multithreading threadpool