使用多线程实现C# Winforms中的响应式GUI

3
我在我的应用程序中有一个子窗体,其中包含50多个组合框,每个组合框都从数据库获取数据。所有组合框都在窗体的加载事件中加载。数据量很大,数据检索需要大约2分钟。当我打开此表单时,整个应用程序变得无响应。应用程序挂起并在大约2分钟后恢复:/
根据我的研究,我们可以使用不同的线程来避免这种情况。请问是否可能、安全和可靠地实现多线程以使我的应用程序响应?
请指导我,并在可能的情况下编写示例代码,说明如何在C#中使用多线程。您可以简单地使用一个包含datatable作为数据源的gridview表格,在单独的线程中进行操作,即使数据库需要很长时间,GUI也是响应的...感谢您的帮助。提前致谢!

你想要异步加载,同时又努力避免过多的线程操纵 GUI。你尝试过启动一个简单的线程来执行该调用,并使用回调通知你何时准备好了吗? - Shark
.NET中有关线程的最佳教程之一:http://www.yoda.arachsys.com/csharp/threads/index.shtml - jAC
亲爱的Shark,我从未实现过多线程。这就是我在这里询问如何实现的原因。它是否安全可靠?什么情况下不应该实现? 你能否给我发送一段示例代码,从数据库中填充datatable,然后将其分配给窗体的加载事件中的gruidview。即使数据检索可能需要超过2分钟,应用程序也应该保持响应性... - user2109843
@user2109843 如果你从未实现过多线程,那么最好的选择是买一本书。购买一本书。 - Regfor
2个回答

7

看一下BackgroundWorker类。它可以完全满足你的需求。你还可以包括一个进度条来显示数据正在加载,以防用户在子窗体中进行操作之前等待。


3
使用任务并行库,该库从 .NET 4 版本开始包含在内,或使用 Parallel Extensions。您可以在此处找到使用 TPL 的示例:http://code.msdn.microsoft.com/windowsdesktop/Samples-for-Parallel-b4b76364 并在此处阅读更多相关信息: http://bradwilson.typepad.com/blog/2012/04/tpl-and-servers-pt1.html http://www.codeproject.com/Articles/30975/Parallel-Extensions-for-the-NET-Framework-Part-I-I http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx http://thenewtechie.wordpress.com/2012/01/03/introduction-to-tpl-part-1/ Reactive Exensions 难度有点大,但是还是很好的。您可以在此处找到示例:http://rxwiki.wikidot.com/101samples
有关其介绍,请参见以下内容: http://www.codeproject.com/Articles/47498/A-quick-look-at-the-Reactive-Extensions-Rx-for-Net http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2010/08/18/reactive-extensions-for-net-stuff-happens.aspx 无论如何,您都可以很容易地找到更多信息。谈到 BackgroundWorker,它是 winforms 的好解决方案。但这种方法已过时。TPL 或 Rx 是新的方法,性能更好,更舒适,特别是当您有太多控件时。拥有太多带有异步操作的控件也是 UI 设计的一个问题,也许应该进行更改。无论如何,BackgroundWorker 也是一个不错的选择,由您决定选择哪个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接