Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务并行库-单核上的并行性_C#_.net_Task Parallel Library - Fatal编程技术网

C# 任务并行库-单核上的并行性

C# 任务并行库-单核上的并行性,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,我正在处理WPF应用程序。 在屏幕/视图中,我必须对WCF服务进行6次调用。这些调用都不相关,因为它们不共享数据,也不相互依赖。我计划使用TPL,并将这6个WCF服务调用作为6个任务。现在,应用程序可以部署在单核机器上,也可以部署在多核机器上 有人告诉我,在单核机器上使用TPL实际上会增加任务完成所需的时间,因为cpu调度程序会增加对不同任务进行时间拼接的开销。这是真的吗。如果是,我应该继续我的设计,还是应该考虑其他选择 如果我必须看看替代方案,这些替代方案是什么:)?当执行CPU密集型操作时,

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

有人告诉我,在单核机器上使用TPL实际上会增加任务完成所需的时间,因为cpu调度程序会增加对不同任务进行时间拼接的开销。这是真的吗。如果是,我应该继续我的设计,还是应该考虑其他选择


如果我必须看看替代方案,这些替代方案是什么:)?

当执行CPU密集型操作时,在单核机器上运行并行线程会增加开销

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


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

一般来说,在单核上运行多线程时,速度会慢一些,因为它在线程之间有上下文切换

我认为下面的图表可以解释这一区别:

正如您所看到的,该图指的是在单核上运行的4个线程,第一次是在多任务中运行,第二次是按顺序运行

您可以看到,在多任务中,所有线程的完成时间都比顺序任务晚


在您的具体案例中,可能不会是相同的,我认为@Guffa的回答是正确的,因为它涉及WCF调用

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

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

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

例如,异步/等待模式可以通过使用
#ifdef
或删除所有等待关键字(使用搜索和替换工具)轻松同步运行<代码>并行。For循环可以直接或通过更改
maxdegreeofpparallelism
轻松转换为正常的
For
循环。任务可以轻松地同步运行


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

另一种可能是异步调用服务。这在C#5中特别容易。您能定义CPU密集型吗。我知道文件系统访问是CPu密集型的,因为CPu必须等待磁盘头读取磁盘。如何识别cpu密集型任务?@HariSubramaniam:cpu密集型工作是指cpu本身正在进行工作,例如繁重的计算。等待磁盘访问不是CPU密集型的,因为CPU在等待磁盘驱动器完成工作时大多处于空闲状态。