我正在开发一个Winforms应用程序(.NET 4.0),我需要同时显示16个图表,在16个不同的线程中有一个响应式UI。我打算直接使用System.Threading.Thread类。
每个图表至少需要5个数据密集型SQL查询(将来会优化,但现在不会优化)。
考虑到这一切 - 我应该关注同时线程的数量吗?我应该实施限制吗?非常感谢。
答案 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 ”段落。