任务并行库 – 单核上的并行性

我正在研究WPF应用程序。
在屏幕/视图中,我必须对WCF服务进行6次调用。 这些调用中没有一个是相关的,因为它们不共享数据,也不相互依赖。 我打算使用TPL并将这6个WCF服务调用作为6个任务。 现在,应用程序可以部署在单个核心机器上,也可以部署在多个核心机器上。

我被告知在单核机器上使用TPL实际上会增加完成任务所需的时间,因为cpu调度程序会花费很多时间来拼接不同的任务。 这是真的。 如果是的话我应该继续我的设计还是我应该看看替代品。

如果我必须看看替代品,那些替代品是什么:)?

在执行CPU密集型操作时,您将通过在单个核心计算机上运行并行线程来增加开销。

在您的情况下,任务不是CPU密集型的,它们正在等待服务调用来响应,因此您可以在单个核心机器上运行并行线程。

根据服务器处理呼叫的方式,可能无论如何都不会有任何时间增加。 如果呼叫在服务器上排队,则无论如何都需要大约相同的时间来运行所有呼叫。 在这种情况下,最好按顺序运行调用,因为它更简单。

您最好的选择是使用多核和单核进行配置。 大多数bios可以设置活动核心的数量,因此它不应该是一个大问题。 您可以进行一些模拟测试,以确定它是否适合您。

显然使用任务切换存在开销问题,但只要每个任务的时间比设置时间长得多,您就不会注意到它。

有许多方法可以实现多任务行为,如果您不知道哪种方法最好,那么您可能需要实际编写一些测试用例并进行一些分析。 这并不难。 如果您只是尝试使用多核系统,那么使用最新版本的.NET通常很容易,您甚至可以将其设置为多核,但可以通过使用适当的构造恢复为单核。

例如,async / await模式可以通过使用#ifdef或删除所有await关键字(使用搜索和替换工具)轻松地同步运行。 Parallel.For循环可以直接或通过更改MaxDegreeOfParallelism轻松转换为正常循环。 可以轻松地同步运行任务。

如果您想使它更透明,您可以使用一些预处理脚本,如T4。

通常,当在单核上运行multithreading时,它会更慢,因为它在线程之间有上下文切换。

我认为下图将解释你的区别:

上下文切换

正如您所看到的,图表是指在单核上运行的4个线程,第一次是多任务处理,第二次是Sequential。

你可以看到,在多任务处理中,所有线程都会在比顺序任务更晚的时候完成。

在你的特定情况下,可能不会是相同的,我认为@Guffa在他的答案中是正确的,因为它涉及WCF调用