2013-04-26 51 views
2

我的應用程序中有一個子表單。這個表格有50多個組合框,每個人都從數據庫獲取數據。所有的combobex都在表單的加載事件中加載。數據很大。數據檢索大約需要2分鐘。當我打開此表單時,我的整個應用程序變得無法響應。大約2分鐘後,應用程序掛起並且獲得生命:/在C#Winforms中使用多線程的響應式GUI

正如我所研究的,我們可以使用不同的線程來避免這種情況。有人可以指導,有可能,安全可靠地實現多線程,以使我的應用程序響應?

請指導我寫一個示例代碼,如果可能的話,多線程如何在c#中工作。你可以簡單地使用一個表單來解釋一個表單,該表單將datatable作爲daTASOURCE在一個單獨的線程中使用,並且GUI甚至可以響應數據庫需要太多時間......任何幫助都會被讚賞。

+0

你想要異步加載,同時也努力不要讓太多的線程在GUI上徘徊。 您是否嘗試過啓動一個簡單的線程來爲您執行該呼叫,並在回調通知您準備好時通知您? – Shark 2013-04-26 10:55:48

+0

有關.NET中線程的最佳教程之一:http://www.yoda.arachsys.com/csharp/threads/index.shtml – jAC 2013-04-26 10:57:12

+0

親愛的鯊魚,我從來沒有實現過多線程。這就是我在這裏問的原因。如何實施?實施安全嗎?什麼時候不應該實施? 你能給我發送一個示例代碼,它將填充數據庫中的數據表,然後在表單的加載事件中分配給gruidview。即使數據恢復可能需要2分鐘以上,應用程序仍然可以響應... – user2109843 2013-04-26 10:58:58

回答

6

看看BackgroundWorker class。這可以做到你想要的。您還可以包含諸如進度條之類的內容,以向用戶顯示數據在繼續之前仍然被加載,並在您的子表單中執行某些操作。

3

使用任務並行庫,它包含在從版本4或並行擴展開始的.NET中。使用TPL的樣品,你可以找到here

而且閱讀更多關於它在這裏:

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/

反應Exensions是一點點更難。但無論如何好。樣品here。 一些介紹在這裏:

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也是一個不錯的選擇,它取決於你選擇什麼。