C# Delegate.BeginInvoke延迟

C# Delegate.BeginInvoke延迟,c#,multithreading,begininvoke,C#,Multithreading,Begininvoke,有时,在调用Delegate.BeginInvoke时,执行委托方法需要一秒钟以上的时间 延误的原因可能是什么?在一个持续运行的应用程序中,我每天会遇到1到2次这个问题 请帮帮我 谢谢 您能设置BeginInvoke的优先级吗 您还有其他BeginInvoke电话在等吗 如果在同一DispatcherPriority进行多个BeginInvoke调用,则将按照调用的顺序执行这些调用 既然您使用的是委派.BeginInvoke,那么您就间接地使用了线程池。ThreadPool回收已完成的线程并允

有时,在调用Delegate.BeginInvoke时,执行委托方法需要一秒钟以上的时间

延误的原因可能是什么?在一个持续运行的应用程序中,我每天会遇到1到2次这个问题

请帮帮我


谢谢

您能设置BeginInvoke的优先级吗

您还有其他BeginInvoke电话在等吗

如果在同一DispatcherPriority进行多个BeginInvoke调用,则将按照调用的顺序执行这些调用


既然您使用的是
委派.BeginInvoke
,那么您就间接地使用了
线程池。
ThreadPool
回收已完成的线程并允许它们被重用,而无需花费构建新线程和拆卸已完成线程的费用

所以。。。使用
Delegate.BeginInvoke
时,只要
ThreadPool
认为它有一个可执行任务的线程,就将要调用的方法添加到队列中。但是,如果
ThreadPool
没有可用的线程,那么您将等待

System.Threading.ThreadPool
有几个属性和方法来显示可用线程的数量、最大值等。我会尝试监视这些计数,看看
ThreadPool
是否正在分散


如果是这种情况,那么最好的解决方案是确保
ThreadPool
仅用于短期(小型)任务。如果它被用于长时间运行的任务,那么这些任务应该被修改为使用它们自己的专用线程,而不是占用线程池。

线程池管理器确保只允许执行CPU核心数量相同的线程。一个任务完成后,另一个正在队列中等待的任务就可以执行

每秒两次,它重新评估正在运行的线程的情况。如果它们没有完成,它将假定它们被阻塞,并允许另一个等待的线程运行。在典型的双核CPU上,您将立即运行两个线程,第三个线程在1秒后启动,第四个线程在1.5秒后启动,等等

这是你的第二个。Q&D解决方案是使用ThreadPool.SetMinThreads(),但这是一个大锤式解决方案。真正的问题是,您的程序正在使用线程池线程执行长时间运行的任务。要么是因为它们执行大量代码,要么是因为它们阻塞了某种I/O请求。后者是更常见的情况


解决这个问题的方法是,对于这样一个阻塞线程,不要使用线程池线程,而是使用thread类。如果线程实际上正在消耗CPU周期,则不要这样做,否则会降低速度。很容易说,你会在Taskmgr.exe中看到100%的cpu负载,这是
控件。BeginInvoke
还是
委托。BeginInvoke
?它正在生成一个新线程-但我不知道这需要多长时间。可能非常快。创建一个新线程相对来说比较昂贵。您如何测量这个延迟?你有没有尝试过像
Console.WriteLine(DateTime.Now)这样的操作在调用
.BeginInvoke()
之前,以及在委托方法中,它是delegate.BeginInvoke。我通过记录来测量差异。调用BeginInvoke之前有一个日志条目。Delegate方法中也有一个日志项。它是Delegate.BeginInvoke。我通过记录来测量差异。调用BeginInvoke之前有一个日志条目。委托方法中也有一个日志项..您好,STW,您如何监视线程池参数?投票还是别的什么?谢谢您可以使用一个简单的计时器,例如
System.Threading.timer
,来调用一个可以收集和报告线程池状态的方法……我不知道这一点,但看起来可能有专门用于执行此操作的性能计数器:嗨,Hans,感谢您的回复。有什么简单的方法可以理解哪个线程池线程阻塞了IO或占用了更多的CPU周期。谢谢如果你不知道,那么你使用了太多。您可以通过记录“开始+结束”来找到答案。