2013-05-08 60 views
2

我正在開發一個使用SQL Compact作爲主數據庫的WinForms應用程序。我被告知我永遠不會與UI線程混淆,每個操作都需要在UI線程之外完成。通過這個演講對於每個CRUD操作,我創建一個線程並出現一個進度條,但我認爲這可能不是最好的方法來做到這一點,我很不確定何時何地使用線程和數據庫操作。我沒有使用UI線程來進行這些數據庫調用,但是如果我願意,我沒有看到任何問題。爲了向用戶顯示信息,我需要時進行調用(以在網格或組合框上顯示數據)。這裏是一個小的一段代碼:使用線程進行數據庫操作的最佳方式是什麼?

this.SuspendLayout(); 

       ProgressDialog progressDialog = new ProgressDialog(); 


       Thread backgroundThread = new Thread(
        new ThreadStart(() => 
        { 
         var unitOfWork = new DAL.Implementations.Entity_Framework.UnitOfWork<dbgmEntities>(); 
         var espacosRepository = unitOfWork.GetRepository<DAL.Espacos>(); 
         Espacos espaco; 

         if (e.Row.Cells["ESP_Descr"].Value != null) 
          espaco = new Espacos { ESP_Nome = e.Row.Cells["ESP_Nome"].Value.ToString(), ESP_Descr = e.Row.Cells["ESP_Descr"].Value.ToString() }; 

         else 
          espaco = new Espacos { ESP_Nome = e.Row.Cells["ESP_Nome"].Value.ToString() }; 


         espacosRepository.AddOrAttach(espaco); 
         unitOfWork.Save(); 

        } 
      )); 


       backgroundThread.Start(); 
       progressDialog.Show(); 
       progressDialog.Close(); 
       this.ResumeLayout(); 

我使用存儲庫模式與SQL精簡和Entity Framework 4.0中,你可以看到我做的內螺紋,而不是在UI線程這將阻止用戶數據庫操作接口,如果它是一個沉重的操作..問題是:

真的有必要從線程之外的線程進行數據庫調用線程或只是一個沉重的操作?就像在不同的表上添加多於1或2行一樣。

感謝

+2

重新_I被告知我永遠不會mess_:那些使用_never_和_always_是_usually_錯誤。 – 2013-05-08 22:34:41

+3

所有絕對值都是錯誤的,包括這一個。 – 2013-05-08 22:52:12

回答

3

UI線程真的應該只是用來顯示的東西,從用戶的用戶和處理輸入事件。其他任何東西都應該分配給工作者線程。這包括數據庫操作。問題是長時間運行的進程會佔用主線程,所以在進程期間無法執行其他任何操作。由於很難保證數據庫操作快速恢復,因此將訪問它的操作放在主線程上可能不是一個好主意。

請記住,這只是一條準則。如果你正在執行的任何工作需要非常少的時間,那麼啓動一個新線程是不值得的。拋開一個新的線程也需要CPU週期,所以它可能不值得在另一個線程上完成這項工作。

一些建議:

  • 不要直接實例線程;改用線程池:ThreadPool.QueueUserWorkItem
  • 不要立即關閉進度條。顯示它,然後在數據庫操作完成後調用該調用以將其隱藏在輔助線程中。

This is a good article on the thread pool.

+0

感謝您的快速回答。我期待着這堂課。 – crawletas 2013-05-08 22:19:06

+0

丹智能線程池怎麼樣? http://www.codeproject.com/Articles/7933/Smart-Thread-Pool#_rating – crawletas 2013-05-10 23:43:25

+0

我只使用過默認的線程池。 – Dan 2013-05-11 03:33:21

0

正如丹說,在UI線程應該簡單地用於顯示的東西,獲取用戶輸入。

但是,我們傾向於做的絕大多數操作都非常快。到旋轉另一個線程增加更多的時間成本比簡單地執行操作本身。我的建議是,你只需要爲需要處理的時間超過幾秒的任何事情啓動一個新線程。

+0

謝謝克里斯,這可以是另一種選擇。 – crawletas 2013-05-09 02:21:49

相關問題