Winforms应用程序中的最大并发线程数

时间:2013-01-02 15:54:29

标签: .net winforms

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

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

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

1 个答案:

答案 0 :(得分:3)

UI拥有自己的线程。 这意味着你不能有不同的线程更新UI (并注意同样适用于WPF gui)。您可以更好地使用BackgroundWorker在后台线程中调用数据库,并在完成后更新UI。这是首选架构。

您的应用程序将充当浏览器,加载页面然后优雅地异步加载所有图像,您将看到您的图表以dinamically方式显示,这通常会让用户更快地感受到应用程序。

让16个背景工作者只是悬挂在DB的响应中,即使不是最好的,也是完全可以接受的。使用后台工作程序有利于线程编组自动完成,只需将图表绑定逻辑放在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模式,对于任何被动应用程序来说,它实际上都是必须

<强>加成 仅仅为了完整起见,由于“挂起代理”是数据库,您甚至可以考虑Asynchronous ADO.NET calls。这可能是您在资源使用方面可以做的最好的事情,因为这将使用I/O Completion Port mechanism来最小化线程和上下文切换的数量,但可能在您的方案中有点过度设计。您可以阅读有关ado.net和I / O完成端口的更多信息here,请查看“ True Asynchronous I / O ”段落。