2012-12-10 32 views
2

我知道我在這裏有一個巨大的DERP的時刻,這可能是很容易做的其實 - 我有一個圍繞搜索和閱讀幾篇文章,但我仍然在努力一點點,所以任何反饋或指向有用的資源將不勝感激!BackgroundWorker的使用的SqlConnection

反正我有一類稱爲PopulateDatagridViews,我有各種功能的其中之一的,被稱爲ExecuteSqlStatement,這個功能是很簡單的,它初始化一個SQL連接,並返回填充了SQL查詢的結果DataTable。在同一個類中,我還有各種使用字符串構建器構建SQL語句的函數。 (不太理想,我知道。)

我在我的GUI線程中創建了一個PopulateDatagridViews對象,並使用它返回DataTables來設置各種datagrid視圖。例如:

dataGridViewVar.DataSource = populateDgv.GetCustomers(); 

當然我有一個問題是,從數據庫中讀取的數據越多,時間越長,U.I沒有響應。我想通過PopulateDatagridViews到檢索數據的過程中轉移到一個獨立的線程或BackgroundWorker從而防止主GUI線程雖然這是處理鎖住。

我意識到我可以創建一個BackgroundWorker來執行此操作,並將DoWork處理函數調用到我的PopulateDatagridViews中相應的函數中。

我想我可以爲我的PopulateDatagridViews類中的每個單獨的函數創建一個BackgroundWorker,但是肯定會有更高效的方法來實現此目的?我非常感謝在這個方向上的正確方向,因爲它正在推動我的彎道!

附加信息:我使用.NET Framework 4.0版本。

+0

哪個.NET版本您使用的? – DHN

+0

我使用.Net –

回答

1

我強烈建議你使用TPL(任務並行庫)http://msdn.microsoft.com/en-us/library/dd537609.aspx 在你的情況下,你將創建第一個任務來拉取一些數據,然後在第一次完成更新UI之後開始第二個任務。 我會試着找到我爲類似問題編寫的代碼。

編輯:添加代碼

Task<return_type> t1 = new Task<return_type>(() => 
      { 
       //do something to take some result 
       return some_result; //return it 
      }); 
      t1.Start(); 
      Task t2 = t1.ContinueWith((some_arg_that_represent_previous_task_obj) =>{//ContinueWith guarantees that t2 is started AFTER t1 is executed!     

       //Update your GUI here 
       //if you need result from previos task: some_arg_that_represent_previous_task_obj.Result //Your dataset or whatever 

      }, TaskScheduler.FromCurrentSynchronizationContext()); //VERY important - you must update gui from same thread that created it! (you will have cross thread exeption if you dont add TaskScheduler.FromCurrentSynchronizationContext() 

希望它能幫助。

+0

的版本4.0這確實聽起來像我所需要的。如果你有一個代碼示例,我會非常感激!我真的不喜歡MSDN的例子,他們往往過於複雜的解釋,以及任何真的。嘿。 –

1

那麼在這種情況下,我建議你閱讀這msdn article得到一些想法。之後你應該尋找一些教程,因爲msdn不是學習東西的最佳來源。 ; O)

+0

哈哈,是的,我同意這一點,我嘗試儘可能使用dotnetperls,遺憾的是它並不像我想的全面!雖然很好的資源。 –