C#禁用USB ReadPipe的垃圾回收
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#禁用USB ReadPipe的垃圾回收,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2015字,纯文字阅读大概需要3分钟。
内容图文
![C#禁用USB ReadPipe的垃圾回收](/upload/InfoBanner/zyjiaocheng/812/44f66c94fc0c475f817ff3fc00d70d07.jpg)
我试图使用FTDI的D3XX.NET从USB端口收集数据.收集数据,然后将其发送到快速傅立叶变换以绘制光谱.即使您错过了一些数据,这也可以正常工作.你不能说.但是,如果您希望将此数据发送到音频输出组件,您会注意到数据丢失.这就是我的问题所在.
收集数据然后将其发送到音频设备.所有数据包都在所需的时间范围内完成.但是,音频正在丢弃它出现的数据.这是一张正弦波在音频输出中的样子:
你可以看到一些数据在开头就丢失了,似乎整个周期在最后都没有丢失.这只是一个例子,它一直在变化.有时似乎数据不存在.
我已经完成了整个处理链,我非常确定声音的数据包正在制作它.
我已经使用过JetBrains性能分析器.我发现如下:ReadPipe方法需要8.5ms,这正是您期望读取的内容.到现在为止还挺好. ReadPipe命令完成后,您有0.5ms的时间来执行另一个ReadPipe,否则您将丢失一些数据.查看分析器输出,我看到:
ReadPipe需要8.5ms,然后有一个垃圾收集条目,平均需要1.6ms.如果这确实偶尔发生,那么我丢失了一些数据.
所以这是代码:它是一个后台工作者:
private void CollectData(object sender, DoWorkEventArgs e)
{
while (keepGoing)
{
ftStatus = d3xxDevice.ReadPipe(0x84, iqBuffer, 65536, ref bytesTransferred); //read IQ data - will get 1024 pairs - 2 bytes per value
_waitForData.Set();
}
}
等待句柄向另一个线程表示数据可用.
那么GC是数据丢失的原因吗?如果是这样,我该如何避免这种情况?
谢谢!
解决方法:
如果您可以确认内存不足,可以尝试将GCSettings.LatencyMode设置为GCLatencyMode.SustainedLowLatency.这将阻止某些阻塞垃圾收集发生,除非您的内存不足.查看docs on latency modes以获取更多详细信息和限制.
如果垃圾收集对您的用例仍然具有太大的破坏性并且您使用的是.NET 4.6或更高版本,则可以尝试调用GC.TryStartNoGCRegion.此方法将尝试保留足够的内存以分配最多指定的数量,并阻止GC直到你用完了预订.如果您的内存使用率相当一致,那么您可以通过传递足够大的值来满足应用程序的使用,但无法保证呼叫成功.
如果您使用的是不支持其中任何一种的旧版.NET,那么您可能会运气不好.如果这是一个GUI应用程序(它看起来像是由事件处理程序判断),则对分配没有足够的控制权.
另一件需要考虑的事情是,对于不能容忍中断的应用程序,C#并不是真正的工具.如果您熟悉编写本机代码,则可以在未管理的线程上执行时间敏感的工作;据我所知,这是唯一可靠的解决方案,特别是如果您的应用程序将在最终用户计算机上运行.
内容总结
以上是互联网集市为您收集整理的C#禁用USB ReadPipe的垃圾回收全部内容,希望文章能够帮你解决C#禁用USB ReadPipe的垃圾回收所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。