- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我长期以来一直是 stackoverflow 的被动用户,发现了很多有用的信息,但这是我在这里的第一个问题。恐怕我的第一个问题有点含糊,因为我没有展示代码,而是描述问题。我不是在寻找直接的解决方案,而是在寻找有关进一步阅读的一些提示,这些提示将使我能够理解我的问题的原因。
我的问题是关于 C# WPF 应用程序 (.NET 4.0),它使用 TPL 对进程外 COM 服务器进行并行调用。进程外 COM 服务器是机械工程中使用的一个相当昂贵的商业应用程序——我们称它为 MechEngApp。 COM 服务器是 64 位可执行文件。我的 C# WPF 应用程序是一个交互式程序,用于自动执行 MechEngApp 中的某些计算。它连接到 MechEngApp,从中读取一些输入,自行进行一些计算并将结果写回 MechEngApp。我们目前正准备切换到新版本的 MechEngApp。虽然在版本 X 中一切正常,但我们在新版本 Y 中遇到了一个奇怪的问题。
我的 C# WPF 应用程序是这样工作的:
使用 MechEngApp 的当前版本 X,这已经工作多年没有任何问题。在 MechEngApp 的新版本 Y 中,我们在某个配置中遇到了问题:
之后我们开始调查,发现 MechEngApp 的 TypeLibs 只有 win32 的注册表项 (HKCR\TypeLib, HKCR\Wow6432Node\TypeLib, HKLM\SOFTWARE\Classes\TypeLib, HKLM\SOFTWARE\Classes\Wow6432Node\类型库)。我们试图将它们复制为 win64 条目,但突然就没有了。 3 也有效。
所以我有一个解决我的问题的方法,但我不明白为什么以及它是如何工作的。这几周看了很多书,增长了进程外COM的使用知识,但还是不能回答一些问题:
A) 对于进程外 COM,混合 32 位和 64 位客户端和服务器并不重要,不是吗?
B) 我读过,对于进程内 COM,ThreadingModel 很重要,但对于进程外,它应该无关紧要。对吧?
C) 注册表中的 win64 TypeLib 条目何时重要?仅当 COM 服务器为 32 位和 64 位客户端提供不同的类型库时?
D) 当 win64 条目存在时,进程间通信有什么不同?为什么我的情况没有。 3 当 win64 条目存在时表现不同?
E) 与 D 相关:为什么将我的 C# 应用构建为 32 位或 64 位程序会影响进程外 COM 服务器的行为?
F) 我们使用多年没有任何问题的 MechEngApp 版本 X 也是一个没有 win64 条目的 64 位应用程序。如果 win64 条目很重要,为什么它在过去起作用?
最佳答案
A) For out-of-process COM mixing 32 and 64 bit clients and servers shouldn't really matter, should it?
COM 会处理这个问题,但拥有匹配的位数总是好的。
B), C), E), F)
见下文。
D) What's the difference in the inter process communication, when the win64 entries exist? Why is my case no. 3 behaving different when the win64 entries exist?
我们不确定第 3 方进程外服务器进程内部发生了什么(例如,它是否使用具有多个线程、单个 STA 线程或多个 STA 线程的 MTA 单元),所以我只能推测。
就是说,我想在您在客户端引入并发之前,内部 MechEngApp
COM 服务器进程没有跨线程 COM 编码。一旦你这样做了,你可能还在 MechEngApp
进程中引入了多线程。显然,MechEngApp
依赖于 COM typelib 编码器,当它在自己的线程之间编码 COM 对象时(例如,使用 CoMarshalInterface
)。这将是进程内编码,因为它发生在 MechEngApp
进程内。为使其正常工作,必须为 64 位应用程序提供正确的 64 位注册表项。
您可能还可以通过以管理员权限运行 MechEngApp.exe/RegServer
来使其工作。
关于c# - 使用 TPL 和进程外 COM 服务器的 C# WPF 应用程序的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23239995/
我有以下 TPL 数据流,当使用谓词过滤从 TransformBlock 传递到 ActionBlock 的项目时,它永远不会完成。 如果谓词对任何项目返回 false,则数据流挂起。 请有人提供一些
我是 smarty 的新手,所以我不确定这是否会导致我遗漏某些内容,但目前我正在尝试从 css 文件中提取一个类。 到目前为止,我已经设置了 2 个类 mainbackground 和 body,ma
如何强制 TPL 使用固定数量的线程?我知道 MaxDegreeOfParallelism 可用于设置上限,但我希望上限等于下限。这可能吗?怎么办? 因为我知道有人会问 =) 是的,我确定我想这样做,
我正在尝试使用 GXT 3.0 的 XTemplates(类似于 EXT),这里有 2 个具有以下关系的简单 java 对象: class A { String name; public
我刚刚将 Visual Studio 11 Beta 升级到新的 Visual Studio 2012 RC,并且在引用 TPL 数据流时遇到了问题。 首先,我尝试像以前一样通过从框架中添加引用来引用
我需要制作可扩展的流程。该进程主要有 I/O 操作和一些次要的 CPU 操作(主要是反序列化字符串)。该过程在数据库中查询 url 列表,然后从这些 url 中获取数据,将下载的数据反序列化为对象,然
我们有一个 TPL 数据流管道,其中包含以下 block : 变换 block A:Http post call 转换 block B:数据库 IO Transform Block C:一些单位转换数
我有一个 BufferBlock 来发布消息: public class DelimitedFileBlock : ISourceBlock { private ISourceBlock _s
我想在 Windows Azure 上的工作进程中使用 TPL。我希望在队列中添加一个 IJob,它有一个 Run 方法,因此工作线程将包括: 循环 将项目从队列中取出 使用TPL调用IJob.Run
我尝试创 build 计良好的 TPL 数据流管道,以优化系统资源的使用。我的项目是一个 HTML 解析器,它将解析后的值添加到 SQL Server DB 中。我已经有了 future 管道的所有方
我想为特定的内容类型覆盖 page.tpl.php。 我已经尝试过这些东西,对我没有任何作用。 page--article.tpl.php page--node--article.tpl.php pa
我已经完成了这个 POC 并验证了当你创建 4 个线程并在四核机器上运行它们时,所有的核心都会变得忙碌——所以,CLR 已经在不同的核心上有效地调度了线程,那么为什么要使用 TASK 类呢? 我同意
使用Visual Studio Concurrency Visualizer我现在明白为什么切换到 Parallel.For 没有任何好处:只有 9% 的时间机器忙于执行代码,其余的时间为 71% 的
我的代码中有以下使用 TPL 的设置: 我的类中的一个字段:private CancellationTokenSource _cancellationTokenSource; 每次我创建使用特定取消
我有一个 Windows 服务,它在经过漫长的过程后发送电子邮件。每当有表条目并处理它并将其发送出去时,该服务就会继续从数据库表中获取电子邮件数据。 目前它是一个多线程应用程序,我们在生产服务器中将线
刚刚使用 TPL DataFlow 编写了示例生产者消费者模式。我在这里有一些基本问题。 只有在生产者发布所有项目后,消费者才处于事件状态。异步是指生产任务和消费任务都可以并行运行。 给消费者一个 s
我正在使用 TPL,需要有一个长时间运行的 TPL 任务将结果发送到父 UI 线程而不终止。我已经尝试了几种方法,并且已经在谷歌上搜索了很多。有谁知道如何通过 TPL 实现这一点? 最佳答案 您可以传
我有一个以这种方式设置的 TPL 数据流: 下载字节数组 处理数据 将处理后的数据流式传输到另一个位置 此流程运行良好,但偶尔会在下载文件时遇到备份、连接问题等。我想做的是并行下载,但仍确保执行第 3
我有一个应该批量调用并压缩大文件的控制台应用程序,我想使用 DataFlow,除了完成之外一切正常 请考虑以下代码 public static void CompressFiles(string fo
当你生成多个任务时,像这样: for (int i = 0; i ((stateObject) => { tls.Value = (int)stateObject;
我是一名优秀的程序员,十分优秀!