关于C#多线程调用大漠(STA模型的COM组件)注意的地方

大漠插件官方说插件是STA模型,对于多线程操作的建议是每个线程创建一个对象去操作。
在C#里按照这个方法去做,如果在工作线程中FindStrFast调用的次数多,然后开的线程再多点,速度会明显下降。
如果只开启一个线程,就会执行的很快,开的线程越多执行的越慢。刚开始我以为是开的线程太多,CPU调度不过来的原因,打开任务管理器一看CPU占用只有30%。

开始以为是字库过大引起的 后来测试发现不是。再后来我以为大漠内部同步了,同时只能有一个FindStrFast调用,这样认为的原因是因为,如果执行相同次数的FindStrFast开一个线程比如运行下来需要5秒,开两个线程时间就会翻倍。

然后开始谷歌STA模型和MTA模型的区别,通过这篇文章发现原来线程能设置线程模式。https://blog.csdn.net/kingofbirdzjy/article/details/1926731?utm_source=app&app_version=4.5.0
进而知道了C#的线程默认是MTA模式的,我觉得可能是线程模式导致的,这篇文章也有讨论:https://www.thinbug.com/q/21451313
里面讲到如果MTA模式的线程里去调用STA的com组件,微软会自动生成一个STA的线程,把MTA线程里对COM组件的调用转发过去,因为每个线程都是用的默认的MTA模式去调用的大漠,然后会把所有对大漠的调用都转发到系统创建的那个STA线程中,造成阻塞。然后去测试了一下,发现把线程设置成STA模式速度提示显著。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页