【问题标题】:Force ThreadPool to start the thread sooner强制 ThreadPool 更快地启动线程
【发布时间】:2013-06-01 09:29:21
【问题描述】:

我使用 ThreadPool.QueueUserWorkItem 在 Windows CE 上创建线程(我使用 .NET Framework 3.5)。有时线程等待某些东西并且启动得太晚了。在 QueueUserWorkItem 文档中,它说委托将在“线程池线程可用时”执行。

有没有办法强制线程池立即执行我的委托? Thread.Start() 会解决这个问题吗?

谢谢!

【问题讨论】:

  • 这个我也想知道
  • 如果您需要立即执行任务,那么您最好使用线程。
  • @C4stor 如果您担心操作系统应该何时安排线程运行,那么 C# 可能不适合该用例。
  • 我的猜测是要么你真的不需要这个,并且等待线程池线程被释放的短时间是好的,即使你不认为它是,或者你的程序在某处滥用线程池,并完全淹没它,使其无法处理,用大量长时间运行的操作填充它,或其他一些它不适合处理的用途;在这种情况下,正确的解决方案是解决这些问题并在应用程序的其他地方正确使用线程池。
  • 如果等不及,为什么还要排队?也许您可以发布更多关于您为什么使用 ThreadPool 的详细信息?

标签: c# multithreading threadpool


【解决方案1】:

首先,QueueUserWorkItem 不会创建线程,它只是在 ThreadPool 的队列中放置一个“任务”以供工作人员获取并执行。在饱和的情况下(任务多于可用线程),无法保证工作人员何时可以执行任务。如果您想立即执行,请改用Thread 的实例。使用 ThreadPool 提高几率的唯一方法是增加工作线程的数量。

编辑:需要明确的是,如果线程池线程确实空闲,它们将接手工作并执行它通常比启动一个新线程更快。

【讨论】:

  • 请注意,即使直接使用Thread 类,您也不能确定您的线程会被安排立即运行。
  • @Servy:确实不会。但这与操作系统调度程序有关。 ThreadPool 并不能保证它的实现方式。
  • 我的意思是都不保证立即执行。请注意,在许多情况下,如果已经有一个空闲的线程池线程,它实际上会比创建一个新线程更快。创建线程需要时间;允许已经创建的线程池线程开始工作需要更少的时间。线程池将有更长的最坏情况时间,但更短的平均情况时间;关键在于哪个对您更重要。
【解决方案2】:

如果您从一个池中启动大量线程,您可能会遇到没有空闲线程并且您的请求排队的情况,这就是为什么有时它开始延迟的原因。尝试增加池中工作线程的最大数量。使用ThreadPool.SetMaxThreadsThreadPool.SetMinThreads 配置池。

【讨论】:

  • 如果你有那么多个线程,那么你的CPU很可能无法通过添加更多线程来跟上。它将花费越来越多的时间进行上下文切换,吞吐量将下降,而不是上升。如果真的有那么很多工作要做,那么等待时间是不可避免的。更好的解决方法是获得更多/更好的硬件。
  • @Servy,如果排队到线程池的其他任务被阻塞,则不会,例如。在网络或其他 I/O 调用上。
  • @MartinJames 那么这意味着你没有正确使用你的线程池。您不应该使用它来让大量线程坐在那里阻塞等待 IO,并且如果可能的话,您应该重构您的程序以不这样做,而不是仅仅增加限制或创建自己的线程,因为那只是扫除问题而不是修复它。
  • @Servy 我完全同意你的看法,我的回答是错误的。控制池的大小是个坏主意。
【解决方案3】:

线程池的大小是有限的。所以你不能在同一时间吃尽可能多的线程。如果所有线程都忙,那么您必须等待一个线程可用。

检查你想要午餐的线程数量并将其与线程池大小进行比较 -> GetMaxThreads()

如果您想要更多线程,只需使用 SetMaxThreads(int) 调整池大小

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多