是线程池设置全局或只为工作的项目?(Are ThreadPool settings global o

2019-10-17 00:17发布

如果我设置ThreadPool.SetMaxThreads在WinForms应用程序做此设置只适用于工作项目或整个组装线如计时器和GUI更新?

我建立这将连续处理半短的操作,通常每1分钟左右的应用程序。 我第一次来到了,工作正常手动线程建立版本。 因为我创造了每一个操作一个新的线程我期待,如果我能创造一个更快,更有效的版本,我和线程池,没有工作更好它甚至挡住了我的计时器和GUI更新实验。 这是正常的还是我用错了?

这里是我的pseude代码:

手册主题版本:(所有MaxThreadThreadCount读取和写入与锁完成)

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--;
}

线程池版本:(电脑是双核Xeon处理器在32位Windows服务器操作系统)

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
}

Answer 1:

根据我的研究MSDN,限制的数量ThreadPool线程会影响下面的线程机制:

  • 线程池
  • System.Threading.Timer
  • System.Timers.Timer
  • TPL任务

因为引擎盖下他们正在使用的线程池来运行他们的工作。
下面将自己的线程中运行:

  • 线
  • 的BackgroundWorker

该GUI计时器将在UI线程上运行: System.Windows.Threading.DispatcherTimerSystem.Windows.Forms.Timer



Answer 2:

在我看来,你是在这里使用这两种方法是不是达到你想要什么样的最佳方式。

这是从来没有明智的第二猜测最佳线程数的线程池应该有,而且有很多因素会对此产生影响。 一些框架和OS是更加能够做到的事情。

在这种情况下,你可能会被关闭使得使用Sempaphore更好。

在回答你的问题,有关于这一个很好的文章在这里。

线程池限制



文章来源: Are ThreadPool settings global or only for work items?