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