【问题标题】:Are ThreadPool settings global or only for work items?ThreadPool 设置是全局的还是仅适用于工作项?
【发布时间】:2012-07-14 02:59:06
【问题描述】:

如果我在 WinForms 应用程序中设置 ThreadPool.SetMaxThreads,此设置是否仅适用于工作项或整个程序集线程,如计时器和 gui 更新?

我正在构建一个应用程序,它将持续处理半短操作,通常每个操作大约 1 分钟。我首先想出了一个可以正常工作的手动线程创建版本。因为我正在为每个操作创建一个新线程,所以我正在寻找是否可以创建一个更快、更高效的版本,并且我尝试了 ThreadPool,它的效果并不好,它甚至阻止了我的计时器和 gui 更新。这是正常的还是我用错了?

这是我的伪代码:

Manual Thread 版本:(所有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--;
}

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


【解决方案1】:

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

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

因为他们在后台使用线程池来运行他们的工作。
以下将在他们自己的线程上运行:

  • 线程
  • 后台工作人员

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

【讨论】:

    【解决方案2】:

    在我看来,您在这里使用的任何一种方法都不是实现您想要的最佳方法。

    再次猜测线程池应该具有的最佳线程数是不明智的,并且有许多因素会对此产生影响。框架和操作系统更有能力做的事情。

    在这种情况下,您最好使用 Sempaphore。

    为了回答您的问题,这里有一篇很好的文章。

    Threadpool throttling

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 2016-04-27
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多