c# - ThreadPool 设置是全局设置还是仅针对工作项?

标签 c# winforms multithreading threadpool

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

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

这是我的伪代码:

手动线程版本:(所有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版本:(电脑是双核至强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
}

最佳答案

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

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

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

  • 话题
  • 后台 worker

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

关于c# - ThreadPool 设置是全局设置还是仅针对工作项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11466533/

相关文章:

c# - 查看接收者是否阅读了电报机器人的消息

c# - 为什么设置 MaximumSize 会破坏表格布局?

创建特定于时间的线程

C套接字,第一个连接的线程关闭剩余的

java - 同步块(synchronized block)内的 IllegalMonitorStateException

javascript - 在 ASP.NET MVC 4 View 中将数据从父窗口传递到弹出(子)窗口

c# - 如何知道反序列化类的类型?(或对象)

c# - 在Windows 8应用中转换字节数组以产生不同的音频声音

.net - 如何绑定(bind) WinForm 文本框以在 TextChanged 而不是 LostFocus 上更新

c# - 表单打开时聚焦于文本框