c# - Delegate.BeginInvoke 延迟

标签 c# multithreading begininvoke

有时在调用 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/

相关文章:

c# - 为 Release 编译的 UWP 中的 MissingTemplateException

JavaFX 线程卡住

c# - 如何异步执行同步方法并等待结果

c# - 如何正确实现 .net 标准库的单元测试

c# - 我应该在 ASP.NET 页面中嵌入的 IFrame 中加载 javascript 吗?

c# 在线程期间从外部方法更新进度表

c# - InvokeRequired 和 BeginInvoke 等效项

.net - .net中实现多线程的不同方式是什么?

c# - 更好地处理丢失的 .NET Framework (0xc0000135) 崩溃?

java - 在 Java 中实现这种线程/事件行为的最佳方式是什么?