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

大漠插件官方建议每个线程创建独立对象进行操作,但在C#中,多线程使用FindStrFast会导致速度下降。线程数量增加并未提升效率,反而可能因线程模式问题造成阻塞。C#线程默认为MTA模式,当调用STA模型的COM组件时,系统会自动创建STA线程转发调用,引发性能问题。将线程设置为STA模式后,性能得到显著提升。
摘要由CSDN通过智能技术生成

大漠插件官方说插件是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模式速度提示显著。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值