有时在调用 Delegate.BeginInvoke 时,执行委托(delegate)方法需要一秒以上的时间。
延迟的原因可能是什么?我在连续运行的应用程序中每天遇到 1 到 2 次这个问题。
请帮帮我。
谢谢!
最佳答案
线程池管理器确保只允许执行与 CPU 核心数相同的线程。一旦一个完成,另一个在队列中等待的就被允许执行。
每秒两次,它会重新评估正在运行的线程的情况。如果它们没有完成,它假定它们被阻塞并允许另一个等待线程运行。在典型的双核 CPU 上,您会立即运行两个线程,第 3 个线程在 1 秒后启动,第 4 个线程在 1.5 秒后启动,等等。
好吧,这是你的第二个。 Q&D 修复是使用 ThreadPool.SetMinThreads(),但这是大锤解决方案。真正的问题是您的程序正在使用线程池线程来执行长时间运行的任务。要么是因为它们执行大量代码,要么是因为它们阻塞了某种 I/O 请求。后者是更常见的情况。
解决方法是不对这样的阻塞线程使用线程池线程,而是使用Thread类。如果线程实际上在消耗 CPU 周期,请不要这样做,否则一切都会变慢。很容易看出,您会在 Taskmgr.exe 中看到 100% 的 CPU 负载
关于c# - Delegate.BeginInvoke 延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3424179/