如果我在WinForms应用程序中设置ThreadPool.SetMaxThreads
,此设置是仅适用于工作项还是整个程序集线程,如计时器和gui更新?
我正在构建一个应用程序,它将持续处理半短操作,通常每次约1分钟。我首先提出了一个手动线程创建版本,工作正常。由于我正在为每个操作创建一个新线程,我正在寻找是否可以创建更快,更高效的版本,并且我使用ThreadPool进行了实验,但是它没有更好地工作,甚至阻止了我的计时器和gui更新。这是正常的还是我使用它错了?
这是我的pseude-code:
手动线程版本:(所有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版本:(计算机是32位Windows服务器操作系统上的双核Xeon)
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
}
答案 0 :(得分:3)
根据我对MSDN的研究,限制ThreadPool
线程的数量将影响以下线程机制:
因为他们正在使用线程池来运行他们的工作。
以下将在他们自己的线程上运行:
GUI计时器将在UI线程上运行:System.Windows.Threading.DispatcherTimer
和System.Windows.Forms.Timer
。
答案 1 :(得分:1)
在我看来,你在这里使用的任何一种方法都不是达到你想要的最好方法。
再次猜测线程池应该具有的最佳线程数是不明智的,并且有许多因素会对此产生影响。框架和操作系统更有能力做的事情。
在这种情况下,使用Sempaphore可能会更好。
在回答你的问题时,这里有一篇很好的文章。