2015-06-02 98 views
-2

所以 - 我有這個外部程序集,我正在使用。它發起了一個事件DataReceived。然後,我正在做一些數據庫操作,這些操作可能由於數據問題或代碼中的錯誤而失敗。如果我能將異常「冒泡」到GUI中,那將是非常好的。在我的情況下,我需要一個阻止調用GUI,因爲組裝工作的方式。我不確定這是否是一個好主意,但現在這是基於外部代碼如何工作的唯一想法。如何處理事件中的異常?

程序集假設如果回調(事件)安全地返回,那麼數據已成功處理 - 可能並非如此。當然,我將不得不以的某種方式處理中的錯誤,但這意味着另一方的服務器將始終假定數據處理正確。

我的問題是:

  • 我可以拋出異常的GUI?如果是這樣,怎麼樣?
  • 如何在我的事件中處理異常,以使程序集不認爲我處理了數據?我需要某種阻止呼叫/異常的GUI? (這是甚至可能嗎?)
  • 在一邊注意:是不是那個程序集設計破壞?爲什麼它會自動假定一切都很好,只要回調函數返回?
+3

您是否在尋找一些建築指導?還是你想解決一個特定的編程錯誤? –

+2

一個好主意是寫一個更好的問題。那麼你不會陷入低谷並關閉。 –

+0

你說得對。這是在半夜,我的大腦已經入睡 - 所以我的問題並不是很明顯。我現在試圖更具體。 我想我主要是在尋找建築指導,因爲我從來沒有犯過一個錯誤,我不得不趕超我自己的程序流程。 – Semmel

回答

0

我不認爲這是打破設計。如果您收到該活動,您會收到通知,信息來源發生了變化。現在你只需要做什麼就可以從源頭獲得你需要的信息,並做任何進一步的處理從源頭解耦。爲此,我會在事件處理程序中簡單地獲取數據(可能來自源代碼;也許來自事件參數)並將它們放入ConcurrentQueue。在我的課堂上,另一個任務正在運行,使用BlockingCollection從這個隊列中檢索元素來處理它們。如果有任何失敗,只需撥打Invoke()到gui線程並通知用戶發生了什麼。

啊,而另一種方法,而不是使用ConcurrentQueue將使用Rx。有了這個,你可以subscribe to an event並觀察它在不同的線程上使用ObserveOn()這將導致幾乎相同(在這種情況下),但使用更多的LINQish語法。