2

我正在编写一个调用 C++ dll 的 C# 应用程序。此 dll 是成像系统的设备驱动程序;获取图像时,可从库中逐行预览图像。C++ dll 需要一个回调来填充预览,该回调基本上由最终图像的大小、当前扫描的行和数据行本身组成。

问题是,从扫描停止和 C# 回调停止获取信息的时间开始存在相当严重的延迟。程序的流程类似于:

  1. 从 C# 中将回调分配给 C++ dll
  2. 用户开始获取数据
  3. 设备启动
  4. dll在几秒钟后开始调用回调(正常)
  5. 设备完成成像
  6. dll 仍在为双倍图像形成时间调用回调。

这个相同的 dll 与 C++ 应用程序一起工作得很好;最后一步似乎没有延迟。但是,在 C# 中,如果我让回调立即返回,则延迟仍然存在;无论我在回调中做什么,它都在那里。

这种延迟是从非托管代码调用托管代码的固有限制,还是任何一方都可以做些什么来加快速度?我正在与 C++ 库编写者联系,因此可以从 C++ 端实现修复。

编辑:可以做一些简单的事情,比如命名管道吗?应用程序可以从自己的管道中读取吗?

4

3 回答 3

0

检查垃圾收集目标的本机回调的托管调试助手可能是罪魁祸首(它是否在调试器下处于调试模式?)

请参阅PSA:在Mike Stall的调试器博客条目下,Pinvokes 可能会慢 100 倍。

于 2009-06-10T23:50:39.217 回答
0

您是否正在跨互操作层进行任何时髦的数据编组?如果是这样,那么您可能会有很大的延迟,而它基本上是通过转换来编组您的所有图像数据。您可以轻松地测试这一点,因为图像数据越大,所需的时间就越长

想到的一些可能的替代方案是
1.使用内存映射文件,尽管您需要实现一个简单的信号量或信号系统来说“我已经准备好数据”和“我已经使用了数据
2.编译 C++ dll在混合模式下(任何 C++ 代码都可以使用 /clr 标志编译成 .NET),然后使用 C#/CLI
3. 使用远程处理和 IPC 通道 - 可能有点矫枉过正,但值得一看

希望有帮助

于 2009-06-15T13:14:46.580 回答
0

事实证明,延迟是在 C++ 方面,由一位上下发誓的开发人员发誓不是。

于 2009-09-23T01:27:20.327 回答