簡體   English   中英

你如何找到在C#中訂閱活動的內容?

[英]How do you find out what is subscribed to an event in C#?

我遇到的問題是我正在處理的應用程序有內存泄漏。 經驗告訴我,垃圾收集語言遇到內存泄漏的第一個地方是處理訂閱事件並且以后未能取消訂閱它們。 第二個與存儲靜態有關。 我是C#的新手,並且對不透明的事件類型感到沮喪。

我們通過抽獎的運氣獲得了一些雙重訂閱錯誤,但應用程序確實將事件用於許多事情。 雖然我們非常清楚取消訂閱您訂閱的所有內容的原則,但仍然存在內存泄漏。 我想系統地確定訂閱什么。

編輯:

感謝您指向GetInvocationList()方法的指針。 我正在嘗試創建一個動態轉儲結果的調試工具。 問題是我發現的解決方案在.Net 2中工作,但不再在.Net 3.5中。 本質上,告訴您獲取EventInfo的相應FieldInfo(分別為反射,GetField和GetEvents)。 但是,在.Net 3.5中沒有相應的FieldInfo,並且EventInfo不會讓我獲得調用列表。

我只想轉儲事件列表及其InvocationList以進行調試。

嘗試在名為GetInvocationListevent上使用方法。

這將返回訂閱該事件的一組委托。

該數組將按照添加的順序包含代理。 這也可以用來從列表中單獨輸出和調用特定的委托,而調用event.Invoke方法將調用它們(但只給你調用的最后一個委托的返回值)

你肯定是正確的 - 懷疑事件訂閱是導致內存泄漏的原因。 幾年前,我們追蹤了一個應用程序范圍的靜態對象訂閱ASP.NET頁面事件的問題 - 你可以猜到那里發生了什么。

解決這個問題的另一種方法是從出版商的角度出發。 將所有訂閱者都放到UNsubscribe可能不方便,但如果發布者需要被銷毀/超出范圍,可能會觸發將其所有事件設置為null - 有效取消訂閱每個人並打破循環。

如果發布者具有更長的生命周期並且保持其他對象存活,則可能必須執行之前建議的GetInvocationList。 但我認為這只是為了調試問題 - 找出誰不應該掛在事件上。

最后,你可以考慮一些基於WeakReferenced的自定義事件訂閱機制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM