Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 冻结托管线程_C#_.net_Multithreading - Fatal编程技术网

C# 冻结托管线程

C# 冻结托管线程,c#,.net,multithreading,C#,.net,Multithreading,我正在开发一个相当大的应用程序,负责实时运动跟踪和相机运动控制。其任务是: 运动跟踪(由本机模块完成,该模块对来自网络摄像机的视频流进行解码,并通过回调向托管应用程序提供1280x720像素的图像缓冲区和跟踪结果) 每秒大约20次从摇摄/倾斜硬件接收定位反馈数据并将移动数据发送到摇摄/倾斜硬件,以及从/发送到相机的变焦命令 显示图像数据,包括实时可视化 图像和会话数据的编码和写入 视频的自动后处理由另一个进程完成 该应用程序使用.NET4.0并具有WPF用户界面 托管线程冻结 从一开始,我们

我正在开发一个相当大的应用程序,负责实时运动跟踪和相机运动控制。其任务是:

  • 运动跟踪(由本机模块完成,该模块对来自网络摄像机的视频流进行解码,并通过回调向托管应用程序提供1280x720像素的图像缓冲区和跟踪结果)
  • 每秒大约20次从摇摄/倾斜硬件接收定位反馈数据并将移动数据发送到摇摄/倾斜硬件,以及从/发送到相机的变焦命令
  • 显示图像数据,包括实时可视化
  • 图像和会话数据的编码和写入
  • 视频的自动后处理由另一个进程完成
该应用程序使用.NET4.0并具有WPF用户界面

托管线程冻结

从一开始,我们就必须面对冻结在500到1500ms之间的托管线程,这对于这样的实时应用程序来说非常重要

为了找出这些挂起何时发生,我创建了一个线程,它唯一的任务就是一直睡眠100毫秒。然后我计算了睡眠所需的时间,得到了相机停止运动的确切时间。它工作非常可靠,所有的线程同时挂起

非托管线程不会冻结

当所有托管线程冻结时,非托管线程可以正常工作。我们通过独立于应用程序的托管部分编写的日志来检查这一点

分析

我试图找出现象可能导致这种行为:

  • 当我们遇到这些问题时,整个机器都会变慢:Windows的响应非常慢(例如,目录列表在Windows资源管理器和我的应用程序中都会挂起半分钟,或者启动应用程序的时间非常长)
  • 我们同时读取和写入数千个文件(跟踪和后处理应用程序),这可能会对windows收费过高
  • GUI的响应变得非常慢
  • 该应用程序使用了大约1.3GB的虚拟内存(根据Process.VirtualMemory64)/500MB的工作集内存(Process.WorkingSet64)——可能是其中的一部分被交换到硬盘上了吗?(如何检查或解决这一问题?)
  • 当然,如果我们停止进程,Windows将再次快速响应,但Windows需要一段时间才能再次正常响应
关于如何对此进行调查的提示将不胜感激。多谢各位

也许GC正在工作?
请参阅精彩文章:

我建议在遇到性能问题时进行进程转储。您可以通过多种方式(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)。