[英]Delegate.BeginInvoke Delay
有时,当调用Delegate.BeginInvoke时,执行委托方法需要一秒以上的时间。
延迟的原因是什么? 我在一个连续运行的应用程序中每天发出1到2次这个问题。
请帮我。
谢谢!
线程池管理器确保只允许执行与CPU内核一样多的线程。 一旦完成,就允许另一个在队列中等待的人执行。
两秒钟,它重新评估正在运行的线程正在发生的事情。 如果它们没有完成,则假定它们被阻止并允许另一个等待线程运行。 在典型的双核CPU上,你将立即运行两个线程,第三个线程在一秒后启动,第四个线程在1.5秒后启动,等等。
嗯,这是你的第二个。 Q&D修复是使用ThreadPool.SetMinThreads(),但这是大锤解决方案。 真正的问题是您的程序正在使用线程池线程来执行长时间运行的任务。 要么是因为它们执行了大量代码,要么是因为它们阻塞了某种I / O请求。 后者是更常见的情况。
解决它的方法是不要将线程池线程用于这样的阻塞线程,而是使用Thread类。 如果线程实际上正在燃烧CPU周期,那么不要这样做,你会减慢一切。 很容易说,你会在Taskmgr.exe中看到100%的cpu负载
由于您正在使用Delegate.BeginInvoke
因此您间接使用ThreadPool
。 ThreadPool
回收已完成的线程并允许它们被重用,而无需花费构建新线程和撕掉已完成线程的费用。
所以...当你使用Delegate.BeginInvoke
你要将要调用的方法添加到队列中,一旦ThreadPool
认为它有一个可用的线程,它将执行它。 但是,如果ThreadPool
没有可用的线程,那么你将等待。
System.Threading.ThreadPool
有几个属性和方法来显示有多少线程可用,最大值等。我会尝试监视这些计数,看看它是否看起来像ThreadPool
正在传播。
如果是这种情况,那么最好的解决方案是确保ThreadPool
仅用于短期(小)任务。 如果它被用于长时间运行的任务,那么应该修改这些任务以使用他们自己的专用线程而不是占用ThreadPool。
你能设置BeginInvoke的优先级吗?
http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx
你还有其他的BeginInvoke电话在等吗?
“如果在同一个DispatcherPriority上进行了多次BeginInvoke调用,它们将按照调用的顺序执行。”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.