2010-07-23 79 views
1

這看起來好像是很常見的任務,但我沒有任何運氣來尋找答案。從DLL更新WPF GUI

我有一個WPF/C#應用程序,嚴重依賴於數據庫例程的dll。我想要DLL來更新一些GUI元素,即進度條。

到目前爲止,似乎答案在於System.ComponentModel中的某處並創建了一個BackgroundWorker。但是,就我所能得到的。

有人可以提供關於如何完成此任務的建議嗎?鏈接,示例代碼,鼓勵的話表示讚賞!

非常感謝,

傑裏

+0

作爲評論快速驅動器....看看WPF的調度。 Dispatcher類爲WPF中的消息泵提供了一個網關,並提供了一種機制來路由UI線程處理的工作:http://msdn.microsoft.com/en-us/magazine/cc163328.aspx – 2010-07-23 03:17:38

回答

3

最好的辦法是設置它,以便在調用數據庫DLL時,UI傳入回調函數。數據庫DLL「週期性地」調用該回調,並且UI中實現的回調會更新UI元素。

這將是最好不要讓你的數據庫DLL與你的用戶界面糟糕。首先,它會使DLL非常依賴於你的UI的細節,直到DLL不能真正被任何其他exe使用。

+0

這是我最大的關注,dll在以後的應用程序中的可重用性。我希望能夠做出任何我足夠通用的東西。但是我喜歡你對回調函數的建議,我將探討這個函數。 – 2010-07-23 18:21:17

0

一個BackgroundWorker會的工作,作爲一個將物體Task(我喜歡Task,個人)。我的博客有an example這兩個這些做後臺工作,完全支持取消和漸進式進展。您可能不需要這種複雜程度(例如,取消)。

1

現在有點難以確切知道你的代碼是如何工作的,我認爲答案取決於你當前的實現是否阻塞了UI(即通過對你的DB DLL進行同步調用)。

現在,如果您對DLL的調用是同步調用,並且阻止用戶界面,那麼您可能需要考慮使用BackgroundWorker來完成這項工作,並允許您的主UI線程避免掛起。一些答案可以參考How do I implement a progress bar in C#?

但是您仍然需要一些機制來了解數據庫調用的進度,而且聽起來並不像DLL那樣暴露出類似的東西。

只是在你的問題的行之間閱讀,聽起來像你有一些修改DLL的能力。如果是這樣,那麼當提供進度信息時,您應該嘗試使用一種模式來保持DLL和UI應用程序之間的分離。您的UI代碼應該根據DLL可以以鬆散耦合的方式提供的一些數據真正地對自身進行更新。我會建議使用兩種:

  • 通過監聽 由 DLL一些類公佈的一個事件訂閱模式;或
  • 輪詢模型主動 監視在DLL中以定期 爲基礎(例如,在定時器標記 處理程序期間)中實施的一些數據對象。

無論採用哪種方式,都希望避免通過對DLL進行編碼來緊密耦合這兩個層,以便對UI層有深入的瞭解。前面提到的兩種可能性都應該允許您在大多數情況下將UI更新代碼保留在應用程序可執行文件的主UI線程中,這對於避免多線程問題非常重要。

+0

你是對的,我創作了dll。你的建議也很有幫助。謝謝回覆! – 2010-07-23 18:24:16