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

C# 哪个更适合多核硬件?多线程或异步方法,c#,.net,wpf,C#,.net,Wpf,我们需要为大屏幕开发一个仪表板应用程序。它所做的是收集所有KPI关键绩效指标,并以可视化方式实时显示在大屏幕上,以便管理层领导知道发生了什么 因此,大屏幕将有20到30个独立的图形和饼图。这个数字可能很快会增加。数据需要在可配置的时间内刷新。从技术上讲,这意味着需要大量的数据库调用来提取数据,并将数据更改通知给GUI。由于有许多单独的图需要更新,我不想同步更新它们,因为对一个图进行耗时的数据库查询会延迟另一个图的更新 所以我有两个选择 运行数据库调用、计算并通知GUI每个图形的单独线程/任务中的

我们需要为大屏幕开发一个仪表板应用程序。它所做的是收集所有KPI关键绩效指标,并以可视化方式实时显示在大屏幕上,以便管理层领导知道发生了什么

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

所以我有两个选择

运行数据库调用、计算并通知GUI每个图形的单独线程/任务中的数据更改。 将所有数据库调用作为异步方法编写,实现计算并在回调中通知GUI 虽然这两种方法都能满足目的,但我想知道哪种解决方案更好,特别是考虑到硬件有16个核的事实。这两种方法的优缺点是什么?还是有更好的方法解决这个问题


我们计划在UI&C中使用.NET 4.0和WPF作为开发语言。

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


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

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


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

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

多线程方法限制了并行操作的数量,因为线程是相对昂贵的资源。但是,如果您需要大约20个线程,则不会有任何问题。用C编写这篇文章可能更容易,因为您可以使用通常的顺序编程风格

异步调用允许您并行执行更多的I/O绑定操作,因为每个调用不占用整个线程,因此效率更高,而且还受益于系统上的多核,因为异步操作是使用线程池处理的。这在C语言中可能更难使用,因为您需要使用诸如BeginXyz之类的APM方法,这使得一些常见的编程模式很难编码


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

< P>我认为这两种技术的要点如下:

多线程方法限制了并行操作的数量,因为线程是相对昂贵的资源。但是,如果您需要大约20个线程,则不会有任何问题。用C编写这篇文章可能更容易,因为您可以使用通常的顺序编程风格

异步调用允许您并行执行更多的I/O绑定操作,因为每个调用不占用整个线程,因此效率更高,而且还受益于系统上的多核,因为异步操作是使用线程池处理的。这在C语言中可能更难使用,因为您需要使用诸如BeginXyz之类的APM方法,这使得一些常见的编程模式很难编码


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

< P>我推荐使用PLIQ和如果可能的话。它们包括优化分区、线程扩展和窃取所有内置工作。

我建议尽可能使用PLINQ和。它们包括优化分区、线程扩展和窃取所有内置的工作。

您建议使用任何其他语言来简化异步。我有点喜欢异步方法而不是线程。你建议使用其他语言来简化异步吗。我有点喜欢异步方法而不是线程。