Maa*_*anu 7 c# multithreading begininvoke
有时,当调用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。