我们需要为巨型屏幕开发仪表板应用程序。它的作用是收集所有KPI(关键绩效指标)并以可视方式实时显示在巨型屏幕上,以便管理层知道最新情况。
如此巨大的屏幕将有20到30个独立的图表和饼图(数字可能很快增加)数据需要在可配置的时间内刷新。它在技术上意味着很多数据库调用来提取数据并通知GUI的数据更改。由于有许多单独的图表需要更新,我不想同步更新它们,因为对一个图形进行耗时的数据库查询会延迟另一个图形的更新。
所以我在这里有两个选择,
虽然这两种方法都可以达到目的,但我想知道哪种解决方案更好,特别是考虑到硬件有16个内核这一事实。这两种方法的优点和缺点是什么?或者有没有更好的方法来解决这个问题?
我们计划使用.NET 4.0&用户界面的WPF和C#作为开发语言。
答案 0 :(得分:5)
我认为关于这两种技术的关键点如下:
多线程方法限制了您可以并行执行的操作数,因为线程是相对昂贵的资源。但是如果你需要大约20个线程,你就不会有任何麻烦。在C#中编写它可能更容易,因为您可以使用通常的顺序编程风格。
异步调用允许您“并行”执行更多数量的I / O绑定操作,因为每次调用都不会占用整个线程,因此这样做效率更高从系统上的多个核心中获益(因为异步操作是使用线程池处理的)。这可能更难以从C#中使用,因为您需要使用诸如BeginXyz
之类的APM方法(这使得一些通常的编程模式难以编码)。
您可以使用一些高级库在C#中编写异步代码 - 例如AsynchronousEnumerator为您提供了一种相对舒适的编程风格。您也可以考虑使用具有异步工作流和消息传递并发性的F#,这很可能是您的问题的完美匹配。
答案 1 :(得分:2)
如果可能,我建议使用PLINQ和task parallel library。它们包括最佳分区,线程缩放和所有内置工作窃取。
答案 2 :(得分:0)
这些方法中的每一种都将使用多线程来实现您的目标。
异步方法只会使繁重的提升部分变得更容易(它们是异步的,因为它们在另一个线程上启动并在完成时通知原始线程。)