2

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

有人告诉我,在单核机器上使用 TPL 实际上会增加任务完成所需的时间,因为在 cpu 调度程序上安排时间拼接不同任务的开销。这是真的。如果是,我应该继续我的设计还是应该寻找替代方案。

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

4

3 回答 3

5

当做一些 CPU 密集型的事情时,你会通过在单核机器上运行并行线程来增加开销。

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

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

于 2012-08-27T10:42:18.580 回答
3

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

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

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

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

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

于 2012-10-17T05:54:59.250 回答
2

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

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

上下文切换

如您所见,该图指的是在单核上运行的 4 个线程,第一次是多任务处理,第二次是顺序处理。

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

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

于 2012-08-27T10:57:19.397 回答