c#多线程如何锁定com组件

ldxab 2010-10-29 07:15:04
我在做项目的时候遇到一个问题:我们的算法引用了matlab函数,所以我们将matlab函数做成了com组件,然后由c#调用,因为com组件是非托管资源,所以节省内存空间避免每次都实例化一个com类,我们将其定义为一个静态变量在程序中引用,一开始我们用的是串行的方式,没有任何问题,后来我们为了加快程序运行速度,将代码分为几个线程同时跑,因为是静态变量所以我们要加锁防止线程冲突,但是现在在多线程跑到引用的代码处有时跑着跑着不知什么时候就会出写乱七八糟的错(比如未处理的comexception,或者调用com就不返回了,一直死在那里等等),好像是没有锁住,我们用过很多锁,(Monitor,lock,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler)等等,一直没有用,,是不是锁不能锁住非托管资源呢?请问还有什么更好的方法么?
...全文
211 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 phil999 的回复:]
如果你担心锁不住非托管资源,可以创建一个专门的对象作为锁:

public static object objLock = new objec();


lock(objLock)
{
// 使用 com 对象

}
[/Quote]

是这样的,这是一个简单的可照抄的概念。
xiehuanxie 2010-10-30
  • 打赏
  • 举报
回复
如果对性能有要求, 建议改用IPP
SecretGarden 2010-10-30
  • 打赏
  • 举报
回复
对于 COM 组件调用,如果单线程运行正常,而多线程运行有问题,则大部分时候都是因为 COM 组件的 Apartment Model 与线程的 Apartment State 不一致问题造成的。

最简单的解决办法是通过 Thread.SetApartmentState 方法将你创建的所有后台线程的 Apartment State 设置为 STA。这个设置必须在线程启动之前进行,否则无效。

如果你对运行性能有非常严格的要求,则需要采取其它的方法。
ldxab 2010-10-30
  • 打赏
  • 举报
回复
大家还有什么想法或建议么?帮帮我啊
ldxab 2010-10-29
  • 打赏
  • 举报
回复
没有用到,这个方法我试过了,还是一样的不行啊,我实在没招了
phil999 2010-10-29
  • 打赏
  • 举报
回复
这个com是否用到了全局的资源或变量啥的
phil999 2010-10-29
  • 打赏
  • 举报
回复
如果你担心锁不住非托管资源,可以创建一个专门的对象作为锁:

public static object objLock = new objec();


lock(objLock)
{
// 使用 com 对象

}
ldxab 2010-10-29
  • 打赏
  • 举报
回复
其实多线程如果锁上的话对com组件来讲都是每次一个线程的调用,所以和串行没什么区别,就是速度加快了而已,现在我考虑可能是没有锁好,可是有什么好方法能锁好呢?是不是非托管资源不能锁住呢?
phil999 2010-10-29
  • 打赏
  • 举报
回复
多线程太复杂,可能有些调用的地方没锁,也有可能是 com 对象用到的资源在多线程情况下出了问题
ldxab 2010-10-29
  • 打赏
  • 举报
回复
而且不是一运行就出问题,而是往往(循环)运行了一段时间才出的问题
ldxab 2010-10-29
  • 打赏
  • 举报
回复
楼上是指的哪块代码的问题?如果是com中的代码,为什么串行没问题?,如果是c#的代码为什么只在调用com语句时出问题,别的地方没问题?
phil999 2010-10-29
  • 打赏
  • 举报
回复
还是代码有问题,好好检查
【更新至2025年】2001-2025年上市公司数字化转型年报词频统计(吴非、赵宸宇、甄红线)(300+年报词频统计) 1、时间:2001-2025年 2、来源:上市公司年报 3、参考文献:企业数字化转型与资本市场表现——来自股票流动性的经验证据(吴非) 数字化转型如何影响企业全要素生产率(赵宸宇) 知识产权行政保护与企业数字化转型(甄红线) 4、方法说明:(1)参考吴非老师的做法,对人工智能技术、大数据技术、云计算技术、区块链技术、数字技术运用五个维度76个数字化相关词频进行统计 (2)参考赵宸宇老师的做法,对数字技术应用、互联网商业模式、智能制造、现代信息系统四个维度99个数字化相关词频进行统计 (3)参考甄红线老师的做法,对技术分类、组织赋能、数字化应用等类别下139个数字化相关词频进行统计 5、指标:年份、股票代码、公司简称、行业名称、行业代码、全文-文本总长度、仅中英文-文本总长度、人工智能技术-吴、大数据技术-吴、云计算技术-吴、区块链技术-吴、数字技术运用-吴、数字技术应用-赵、互联网商业模式-赵、智能制造-赵、现代信息系统-赵、技术分类-人工智能技术-甄、技术分类-区块链技术-甄、技术分类-云计算技术-甄、技术分类-大数据技术-甄、组织赋能-人工智能技术-甄、组织赋能-云计算技术-甄、组织赋能-大数据技术-甄、组织赋能-广义数字技术-甄、数字化应用-技术创新-甄、数字化应用-流程创新-甄、数字化应用-业务创新-甄、人工智能、商业智能、图像理解、投资决策辅助系统、智能数据分析、智能机器人、机器学习、深度学习、语义搜索、生物识别技术、人脸识别、语音识别、身份验证、自动驾驶、自然语言处理、大数据、数据挖掘、文本挖掘、数据可视化、异构数据、征信、增强现实、混合现实、虚拟现实、云计算、流计算、图计算、内存计算、多方安全计算、类脑计算、绿色计算、认知计算等300+词频

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧