0

我正在开发一个 Winforms 应用程序 (.NET 4.0),我需要在 16 个不同的线程中同时显示 16 个图表,才能获得响应式 UI。我打算直接使用 System.Threading.Thread 类。

每个图表至少需要 5 个数据密集型 SQL 查询(将来会优化,但不是现在)。

考虑到这一切——我应该关心同时线程的数量吗?我应该实施限制吗?非常感谢。

4

1 回答 1

3

UI 有它自己的线程。这意味着您不能让不同的线程更新 UI(请注意,即使对 WPF gui 也是如此)。您可以更好地使用BackgroundWorker在后台线程中调用数据库,并在完成后更新 UI。这是首选架构。

您的应用程序将表现为加载页面的浏览器,然后优雅地异步加载所有图像,您将看到图表以动态方式显示,这通常会使用户感觉应用程序更快。

让 16 名后台工作人员只是挂在数据库的响应中,即使不是最好的,也是完全可以接受的。使用后台工作者的好处是线程编组是自动完成的,只需将图表绑定逻辑放在RunWorkerCompleted事件处理程序中,将数据检索逻辑放在DoWork事件处理程序中。

下面是一个片段:

BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += (sender, e) => { //data retrieving logic here }
bgw.RunWorkerCompleted+= (sender, e) => { //bind results to chart here if no canceled nor errors }
bgw.RunWorkerAsync();//starts async execution

通过这种方式,您将实现异步 UI 模式,这对于任何响应式应用程序来说都是必须的。

另外 为了完整起见,由于“挂起代理”是数据库,您甚至可以考虑异步 ADO.NET 调用。这可能是您在资源使用方面可以做的最好的事情,因为这将在后台使用 I/O 完成端口机制来最小化线程和上下文切换的数量,但在您的场景中它可能有点过度设计。您可以在此处阅读有关 ado.net 和 I/O 完成端口的更多信息,请查看“真正的异步 I/O ”段落。

于 2013-01-02T15:59:14.650 回答