C# 冻结托管线程
我正在开发一个相当大的应用程序,负责实时运动跟踪和相机运动控制。其任务是:C# 冻结托管线程,c#,.net,multithreading,C#,.net,Multithreading,我正在开发一个相当大的应用程序,负责实时运动跟踪和相机运动控制。其任务是: 运动跟踪(由本机模块完成,该模块对来自网络摄像机的视频流进行解码,并通过回调向托管应用程序提供1280x720像素的图像缓冲区和跟踪结果) 每秒大约20次从摇摄/倾斜硬件接收定位反馈数据并将移动数据发送到摇摄/倾斜硬件,以及从/发送到相机的变焦命令 显示图像数据,包括实时可视化 图像和会话数据的编码和写入 视频的自动后处理由另一个进程完成 该应用程序使用.NET4.0并具有WPF用户界面 托管线程冻结 从一开始,我们
- 运动跟踪(由本机模块完成,该模块对来自网络摄像机的视频流进行解码,并通过回调向托管应用程序提供1280x720像素的图像缓冲区和跟踪结果)
- 每秒大约20次从摇摄/倾斜硬件接收定位反馈数据并将移动数据发送到摇摄/倾斜硬件,以及从/发送到相机的变焦命令
- 显示图像数据,包括实时可视化
- 图像和会话数据的编码和写入
- 视频的自动后处理由另一个进程完成
- 当我们遇到这些问题时,整个机器都会变慢:Windows的响应非常慢(例如,目录列表在Windows资源管理器和我的应用程序中都会挂起半分钟,或者启动应用程序的时间非常长)
- 我们同时读取和写入数千个文件(跟踪和后处理应用程序),这可能会对windows收费过高
- GUI的响应变得非常慢
- 该应用程序使用了大约1.3GB的虚拟内存(根据Process.VirtualMemory64)/500MB的工作集内存(Process.WorkingSet64)——可能是其中的一部分被交换到硬盘上了吗?(如何检查或解决这一问题?)
- 当然,如果我们停止进程,Windows将再次快速响应,但Windows需要一段时间才能再次正常响应
请参阅精彩文章:我建议在遇到性能问题时进行进程转储。您可以通过多种方式(SysInternals中的taskmgr.exe或procdump.exe)执行此操作。进行完全内存转储 一旦有了.dmp文件,就可以使用windbg(或Visual Studio 2010)对其进行分析。对于托管流程,您需要加载sos.dll扩展 有很多优秀的windbg资源,但这里有一些帮助了我: 1) Tess Fernandez(ASP.NET进程,但技术相同) (二)
内存分析将能够在您遇到问题时为您提供堆栈(
!clrstack
),并告诉您确切的原因。您描述的内容听起来像是抖动:尝试使用FileMon和DiskMon查看磁盘访问的实际情况。运行taskmgr.exe,processs选项卡。查看+选择列并勾选“页面错误增量”。通常的下一个结论是“啊,需要更多的RAM”。@HansPassant:我在“页面错误增量”下得到的值高达70.000。这是不是指“痛击”?(顺便说一句:你本可以为这篇文章创建一个新的答案而不是评论)感谢你的提示,我们解决了这个问题:有一些代码创建了很多堆对象。现在,我们防止创建太多的对象,并在需要完全性能时收集GC,因此GC只是在之后完成(->GCSettings.GCLatencyMode)。