[英]If I ensure two threads never run in parallel do I still have to make my list variable volatile?
[英]What's the point of using Tasks if I have to create my own STA Threads to run them in parallel?
我已经阅读和观看了很多有关为什么要使用Tasks而不是线程的Microsoft视频的资料,这很有意义(我认为)。 但是,来自Microsoft的有关.NET并行编程的博客使我感到困惑。
我的理解是,通过使用任务,我可以更好地利用多个内核,并使这些任务并行运行。 问题是我正在调用实例化某些COM对象的本机代码,因此我的任务必须在STA线程上运行。
在本文中,作者说要使Task在STA线程上运行,您必须从STA线程创建任务。 他创建一个STA线程并从中创建10个任务,然后评论说由于从一个线程创建任务,所有任务将按顺序运行。
等等...为什么? 如果我必须创建自己的线程来使我的Tasks并行运行,那不是要破坏目的吗? 他们为什么不并行运行?
我想念什么?
如果我必须创建自己的线程来使我的Tasks并行运行,那不是要破坏目的吗? 他们为什么不并行运行?
好了,针对您的情况的特定问题是您正在与单线程单元 (STA)COM对象进行交互。 STA表示它不是线程安全的。
大多数(如果不是全部)UI COM对象(例如Microsoft Office Ole Automation中的任何对象)由于设计或历史原因都不是线程安全的,因此必须从创建它们的线程中调用。 所有此类方法调用都是通过Windows消息泵发送的,因此为什么要序列化它们。
如果您尝试从辅助线程更新自己的UI,也没有什么不同-您不能。
如果必须创建自己的STA线程以并行运行它们,那么使用Tasks有什么意义?
好吧,根据那篇文章,您最终将创建自己的任务调度程序,而不仅仅是“创建自己的...线程” 。 定制任务计划程序不是一件坏事,TPL允许这样做
如果它们都属于同一进程,则将永远无法并行调用STA COM对象
看来您可能是将此COM STA问题归咎于TPL,这有点不公平。 无论您是完全避免使用TPL还是使用自己的线程,STA线程问题仍然存在。 如果您尝试从c ++调用STA COM对象; 或通过局域网上的联网计算机使用DCOM时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.