2012-08-27 69 views
2

我正在开发WPF应用程序。
在屏幕/视图中,我必须对WCF服务进行6次调用。这些调用都不涉及它们不共享数据,也不相互依赖。我打算使用TPL并将这6个WCF服务调用作为6个任务。现在,应用程序可以部署在单个核心机器或多个核心机器上。任务并行库 - 单核并行度

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

如果我要寻找替代,那些是什么替代品:)?

+0

另一种可能性是异步调用的服务。在C#5中这尤其容易。 – svick

回答

5

在做什么CPU密集型的,你将是单核的机器上运行的并行线程加入的开销。

你的情况的任务不是CPU密集型,他们正在等待一个服务呼叫响应,这样就可以很好的单核的机器上运行并行线程。

根据服务器如何处理来电,可能没有任何反正时间而增加。如果呼叫在服务器上排队,则无论如何都需要几乎同时运行所有呼叫。在这种情况下,按顺序运行呼叫会更好,因为它更简单。

+0

您能否定义CPU密集型?我知道文件系统访问是CPu密集型的,因为CPU必须等待磁盘头读取磁盘。我如何识别cpu密集型任务? –

+0

@HariSubramaniam:CPU密集型工作是CPU本身正在完成工作的时候,例如,繁重的计算。等待磁盘访问不是CPU密集型的,因为CPU大多处于空闲状态,等待磁盘驱动器完成工作。 – Guffa

1

一般来说,当运行在单核多线程它会慢一些,因为它具有在螺纹之间上下文切换。

我觉得下面的图表会解释你的区别:

Context Switch

正如你所看到的图是指在单核心,多任务和第二时间顺序第一次运行4个线程。

你可以看到,在多任务的所有线程将比顺序任务以后的时间完成。

在您的具体情况可能会不一样,我认为@Guffa是正确的,因为它涉及到WCF他的回答呼吁

3

最好的办法是使用多核心和单核心配置文件。大多数BIOS可以设置活动核心的数量,所以它不应该是一个大问题。你可以做一些模拟测试,看看它是否适合你。

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

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

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

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