我在做项目的时候遇到一个问题:我们的算法引用了matlab函数,所以我们将matlab函数做成了com组件,然后由c#调用,因为com组件是非托管资源,所以节省内存空间避免每次都实例化一个com类,我们将其定义为一个静态变量在程序中引用,一开始我们用的是串行的方式,没有任何问题,后来我们为了加快程序运行速度,将代码分为几个线程同时跑,因为是静态变量所以我们要加锁防止线程冲突,但是现在在多线程跑到引用的代码处有时跑着跑着不知什么时候就会出写乱七八糟的错(比如未处理的comexception,或者调用com就不返回了,一直死在那里等等),好像是没有锁住,我们用过很多锁,(Monitor,lock,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler)等等,一直没有用,,是不是锁不能锁住非托管资源呢?请问还有什么更好的方法么?

解决方案 »

  1.   

    楼上是指的哪块代码的问题?如果是com中的代码,为什么串行没问题?,如果是c#的代码为什么只在调用com语句时出问题,别的地方没问题?
      

  2.   

    多线程太复杂,可能有些调用的地方没锁,也有可能是 com 对象用到的资源在多线程情况下出了问题
      

  3.   

    其实多线程如果锁上的话对com组件来讲都是每次一个线程的调用,所以和串行没什么区别,就是速度加快了而已,现在我考虑可能是没有锁好,可是有什么好方法能锁好呢?是不是非托管资源不能锁住呢?
      

  4.   

    如果你担心锁不住非托管资源,可以创建一个专门的对象作为锁:public static object objLock = new objec();
    lock(objLock)
    {
       // 使用 com 对象}
      

  5.   

    这个com是否用到了全局的资源或变量啥的
      

  6.   

    对于 COM 组件调用,如果单线程运行正常,而多线程运行有问题,则大部分时候都是因为 COM 组件的 Apartment Model 与线程的 Apartment State 不一致问题造成的。最简单的解决办法是通过 Thread.SetApartmentState 方法将你创建的所有后台线程的 Apartment State 设置为 STA。这个设置必须在线程启动之前进行,否则无效。如果你对运行性能有非常严格的要求,则需要采取其它的方法。
      

  7.   

    如果对性能有要求, 建议改用IPP