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

fun*_*ing 1 .net c# wpf

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

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

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

  1. 在每个图形的单独线程/任务中运行数据库调用,计算并通知GUI数据中的更改.
  2. 将所有数据库调用写为异步方法,实现计算并在回调中通知GUI

虽然这两种方法都可以达到目的,但我想知道哪种解决方案更好,特别是考虑到硬件有16个内核这一事实.这两种方法的优点和缺点是什么?或者有没有更好的方法来解决这个问题?

我们计划使用.NET 4.0和WPF作为UI和C#作为开发语言.

Tom*_*cek 5

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

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

  • 异步调用允许您"并行"执行更多数量的I/O绑定操作,因为每个调用不占用整个线程,因此这更有效,并且还受益于系统上的多个内核(因为异步操作是使用线程池处理).这可能更难以从C#中使用,因为您需要使用诸如的APM方法BeginXyz(这使得一些通常的编程模式难以编码).

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