作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为开发人员,我已经有一段时间没有使用 OLE/COM,但我目前需要使用 C# 程序中的一些第 3 方 OCX 代码库。
C# 程序使用线程(它是一个 TCP 套接字服务器)。 OCX 被标记为单元线程模型。根据我的阅读,我得出结论,如果我小心地为每个线程创建每个 OCX 的一个实例,并且只从创建它的线程使用该实例,我应该没问题。
我也做过:-
myThread.SetApartmentState(ApartmentState.STA);
在开始每个线程之前。
这是否足以确保安全使用 OCX?
我看到的症状是线程都可以创建 OCX,但在明显随机的基础上,准备和初始化 OCX 的调用失败。他们似乎没有返回任何有用的信息来说明原因。
任何人都可以解释我所看到的,或者给我一个从线程代码中安全使用这些 OCX 的指南吗?
或者,我是否应该放弃并在一个线程中创建每个和所有 OCX 的单个实例,并通过线程安全队列或类似方式将所有调用发送给它们?
最佳答案
将组件标记为 Apartment threaded 只是组件开发人员的断言。周围有很多不了解线程的组件开发人员,即使那些了解线程的人有时也会弄错,所以相信这个断言是一种信仰行为。
出于这个原因,我个人对在多线程环境中使用第 3 方组件非常谨慎。除了那些我知道在多线程应用程序中有非常广泛的接触,和/或我知道我可以获得足够支持的人。
如果您无法获得组件开发人员的支持或组件的源代码,并且您绝对需要使用它,那么创建单个实例的选项可能是一个很好的实用解决方案。
关于c# - 使用来自 C# .NET 的 OCX 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972325/
我是一名优秀的程序员,十分优秀!