我有一個事件是從第三方庫引發的,後者在後臺線程上執行。該事件基本上通知監聽器在系統中正在監視的狀態更新。如果InvokeRequired爲true,則處理程序在UI線程上自行調用,並且在任一情況下繼續將狀態更改的條目追加到文本框中的文本中,並在托盤中彈出通知。事件處理程序很快出現很多次似乎「短路」
現在,問題在於這些狀態更新可能會非常迅速;被監控的系統可以在幾毫秒內從其「空閒」狀態通過幾箇中間體轉變爲「就緒」狀態。我需要知道系統已經過渡到所有這些中間狀態;但是,並非所有的狀態變化都正在進入日誌。設置一個斷點並單步執行處理程序會顯示最奇怪的行爲;處理程序將逐步完成前幾行代碼,然後跳回到方法的入口。就好像事件或Windows消息泵正在中止方法調用一樣,因爲調用同一方法的另一個調用是傳入的。將方法主體放在鎖定塊中並不能解決問題。
我以前在其他沒有使用這個第三方庫的項目中見過這個。那時我並不擔心,因爲快速事件只是觸發窗口重繪。如果它們都發生了,那麼很好,但如果發生短路,管道中還會有另一個通過。然而,這是一項更重要的應用程序任務,每次事件發生時都必須發生,以便順利進行(不必像州政府實際發生的變化一樣快;絕對不會這樣做)。
這種短路行爲的原因是什麼?如何阻止它?
什麼是日誌記錄機制?也許事件B和C的日誌條目失敗,因爲關鍵資源已被鎖定,因爲它仍在記錄事件A? – Beska
「日誌」非常簡單;它附加到狀態窗口中的文本框的文本,並且如果它是最終用戶感興趣的事件,則彈出通知。非常簡單,但它們需要在UI線程中運行。 – KeithS