哪个更适合多核硬件?多线程或异步方法

时间:2010-05-19 15:23:02

标签: c# .net wpf

我们需要为巨型屏幕开发仪表板应用程序。它的作用是收集所有KPI(关键绩效指标)并以可视方式实时显示在巨型屏幕上,以便管理层知道最新情况。

如此巨大的屏幕将有20到30个独立的图表和饼图(数字可能很快增加)数据需要在可配置的时间内刷新。它在技术上意味着很多数据库调用来提取数据并通知GUI的数据更改。由于有许多单独的图表需要更新,我不想同步更新它们,因为对一个图形进行耗时的数据库查询会延迟另一个图形的更新。

所以我在这里有两个选择,

  1. 运行数据库调用,计算和&在每个图形的单独线程/任务中向GUI通知数据更改。
  2. 将所有数据库调用写为异步方法,实现计算并通知回调中的GUI
  3. 虽然这两种方法都可以达到目的,但我想知道哪种解决方案更好,特别是考虑到硬件有16个内核这一事实。这两种方法的优点和缺点是什么?或者有没有更好的方法来解决这个问题?

    我们计划使用.NET 4.0&用户界面的WPF和C#作为开发语言。

3 个答案:

答案 0 :(得分:5)

我认为关于这两种技术的关键点如下:

  • 多线程方法限制了您可以并行执行的操作数,因为线程是相对昂贵的资源。但是如果你需要大约20个线程,你就不会有任何麻烦。在C#中编写它可能更容易,因为您可以使用通常的顺序编程风格。

  • 异步调用允许您“并行”执行更多数量的I / O绑定操作,因为每次调用都不会占用整个线程,因此这样做效率更高从系统上的多个核心中获益(因为异步操作是使用线程池处理的)。这可能更难以从C#中使用,因为您需要使用诸如BeginXyz之类的APM方法(这使得一些通常的编程模式难以编码)。

您可以使用一些高级库在C#中编写异步代码 - 例如AsynchronousEnumerator为您提供了一种相对舒适的编程风格。您也可以考虑使用具有异步工作流消息传递并发性的F#,这很可能是您的问题的完美匹配。

答案 1 :(得分:2)

如果可能,我建议使用PLINQ和task parallel library。它们包括最佳分区,线程缩放和所有内置工作窃取。

答案 2 :(得分:0)

这些方法中的每一种都将使用多线程来实现您的目标。

异步方法只会使繁重的提升部分变得更容易(它们是异步的,因为它们在另一个线程上启动并在完成时通知原始线程。)