繁体   English   中英

如果必须创建自己的STA线程以并行运行它们,那么使用Tasks有什么意义?

[英]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有什么意义?

  1. 好吧,根据那篇文章,您最终将创建自己的任务调度程序,而不仅仅是“创建自己的...线程” 定制任务计划程序不是一件坏事,TPL允许这样做

  2. 如果它们都属于同一进程,则将永远无法并行调用STA COM对象

结论

看来您可能是将此COM STA问题归咎于TPL,这有点不公平。 无论您是完全避免使用TPL还是使用自己的线程,STA线程问题仍然存在。 如果您尝试从c ++调用STA COM对象; 或通过局域网上的联网计算机使用DCOM时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM