【发布时间】:2017-11-04 00:46:13
【问题描述】:
我已经阅读和观看了很多关于为什么我应该使用任务而不是线程的 Microsoft 视频,这很有意义(我认为)。但是这个来自微软Parallel Programming with .NET 的博客让我很困惑。
我的理解是通过使用任务,我可以更好地利用多核并让这些任务并行运行。问题是我正在调用实例化一些 COM 对象的本机代码,因此我的任务必须在 STA 线程上运行。
在本文中,作者说要让任务在 STA 线程上运行,您必须从 STA 线程创建任务。他创建了一个 STA 线程并从中创建了 10 个任务,然后由于从一个线程中创建任务,他确定所有任务将按顺序运行。
等等……为什么?如果我必须创建自己的线程来让我的任务并行运行,那不是违背了目的吗?为什么它们不并行运行?
我错过了什么?
【问题讨论】:
-
在这种情况下他是在谈论单核吗?那么所有线程都按顺序运行是有意义的。其实他是。查看线程数: var sta = new StaTaskScheduler(numberOfThreads:1);
-
是和不是。使用任务通常是一种更清晰的抽象,并且 C# 在使用它们时具有一些额外的功能。但是,您实际上并不能保证它们并行运行 - 它们被放入队列中,并且它们等待被现有线程(或多或少)拾取。尽管您也不能真正保证本机线程并行运行,因为您依赖操作系统进行调度和上下文切换。不过,我想有人已经编写了本机任务调度程序,因此您也许可以使用现有的库。
-
正如作者所说:“一般来说,最好避免使用 STA 对象”。
-
使用任务而不是线程的一个论点是消除上下文切换。我在具有 2 个 CPU 的 VM 中运行,并且任务按顺序运行。除非我在那篇文章中使用该代码,然后它们在创建的多个线程上按顺序运行。那么性能提升在哪里?我没听懂。
-
@YuriS...当然...但也读到它对于 COM 对象是必要的。所以我别无选择。
标签: c# multithreading parallel-processing task-parallel-library taskscheduler