2010-02-24 70 views
5

我有一個場景,其中有一組綁定到winforms中的數據網格的對象。如果用戶將一個項目拖放到網格上,我需要在網格中添加一個佔位符行,並啓動冗長的異步導入過程。我需要將異步導入過程的狀態反饋回UI,更新網格中的行,並讓UI保持響應以允許用戶編輯其他行。WinForms中的數據綁定執行異步數據導入

這樣做的最佳做法是什麼?

我目前的解決方案是:將thread safe implementation of BindingList綁定到網格,並填充在網格中顯示爲行的對象。當用戶將一個項目拖放到網格上時,我創建了一個新對象,其中包含從已刪除項目獲取的稀疏信息,並將其添加到BindingList,禁用該行的編輯。然後我引發一個單獨的線程來執行導入操作,將剛剛創建的新綁定對象傳遞給它以填充數據。導入過程定期設置對象的狀態並觸發UI訂閱的事件,告訴它刷新網格以查看對象上的新屬性。

我是否應該將綁定到網格的同一對象傳遞給導入進程線程進行操作,還是應該使用BeginInvoke創建副本並將對UI線程上對象的更改合併到一起?

此實施有何問題或建議?

感謝

+0

如果不知道更多關於BindingList中包含的對象的性質的信息,真的很難說。 他們自己也是線程安全的嗎?如果是這樣,費用是多少?它們只是一組普通的字段,還是存在一些複雜的數據結構,如列表和樹?在前一種情況下,您可以保持原樣:它是「一個作者,一個讀者」的情況,應該是線程安全的。在後一種情況下,取決於您如何確保線程安全:它可能會產生顯着的性能損失。無論如何,請告訴更多關於這些物體的信息,然後它會更容易分辨。 –

回答

1

確定...

我看到事件的流程是這樣的:

  1. 用戶拖放項目以網格
  2. 異步過程拉開序幕
  3. 用戶界面更新爲顯示「正在處理」
  4. 回調處理程序獲取異步處理的響應
  5. 異步回調更新b引發源
  6. 異步回調調用網格上的「數據綁定」以刷新視圖以包含新數據。

我會使用線程而不是後臺工作者,但我很自信地使用線程。

後臺工作人員確實簡化了線程,如果您不信任,那將是我推薦的起點。

通過這種方式,您可以將源代碼和用戶界面一起更新,用戶可以在處理過程中繼續使用該應用程序。

0

這聽起來像一個報告進度後臺工作會幫你做你的導入操作和UI報告。 你應該閱讀關於這個MSDN上的背景工作者類

0

我認爲BackgroundWorker會幫助你完成這個任務(你也可以在UI線程上使用正確的invoke()調用的獨立線程)。問題是由所有單獨的線程完成UI的更新。您知道,UI的所有更新都需要在UI出現的同一線程上,因此,使用鎖創建BindingList的安全實現並進行大量更新可能會導致表單無響應。 如果您使用BackgroundWorker嘗試限制ReportProgress的使用,如果表單滯後於改進功能的更安全的方法是使用2個數據網格。你可以將它們放置一個,就像它只是一個網格。

再見

0

我會說這是最好創建一個副本,合併回更改UI線程上的對象,因爲使用原始參考其他approach-會要求你做更多的鎖定在對象和綁定列表。