
這個界面運行了11次了,就有11個物體在那里(計數應該就是還存在的數量),我試過dispose、解構式釋放可能的變數都沒用,怎么破?謝謝!
uj5u.com熱心網友回復:
要看這個類,是不是一直在被參考。uj5u.com熱心網友回復:
沒啊,只是有時會跳轉到這個界面,我看了整個專案,沒其它參考它的。
uj5u.com熱心網友回復:
在整個專案里,查找這個類名,看它出現在哪里跳轉到這個界面,然后離開了嗎?
uj5u.com熱心網友回復:
記憶體快照可以這么讀:每次界面顯示,XXXResult訂閱了StartupFlowManager的(或許是)靜態成員XXXBiochMachine的事件,卻沒有取消訂閱。
由于事件訂閱,XXXBiochMachine要留存XXXResult實體的參考(才可以發出事件),造成XXXResult實體不能被GC。
解決方法,先試試找到訂閱的地方,類似
StartupFlowManage.XXXBiochMachine.SomeEvent += XXXResult實體事件回應函式;
在合適時機(比如離開界面),取消訂閱
StartupFlowManage.XXXBiochMachine.SomeEvent -= XXXResult實體事件回應函式;
uj5u.com熱心網友回復:
目測需要先-=定義的事件。不如貼出些關鍵代碼uj5u.com熱心網友回復:
你好,類訂閱了這個事件
MachineHelper.StartupFlowManager.AllFlowsCompleted += StartupFlowManager_AllFlowsCompleted;
不過取消訂閱了
MachineHelper.StartupFlowManager.AllFlowsCompleted -= StartupFlowManager_AllFlowsCompleted;
uj5u.com熱心網友回復:
你好,有訂閱事件,不過取消訂閱了,就是是異步取消訂閱的
Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
if (_isReturn)
{
_countDown.CountDownFinish -= CountDown_CountDownFinish;
MachineHelper.StartupFlowManager.AllFlowsCompleted -= StartupFlowManager_AllFlowsCompleted;
}
}).AsTask();
uj5u.com熱心網友回復:
異步嗎? 有可能 先執行取消 后執行訂閱不?uj5u.com熱心網友回復:
取消事件怎么用異步了,-=就是取消對方法參考而已。
uj5u.com熱心網友回復:
異步嗎? 有可能 先執行取消 后執行訂閱不?
不可能,界面初始化的時候訂閱
uj5u.com熱心網友回復:
目測需要先-=定義的事件。不如貼出些關鍵代碼
你好,有訂閱事件,不過取消訂閱了,就是是異步取消訂閱的
Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
if (_isReturn)
{
_countDown.CountDownFinish -= CountDown_CountDownFinish;
MachineHelper.StartupFlowManager.AllFlowsCompleted -= StartupFlowManager_AllFlowsCompleted;
}
}).AsTask();
取消事件怎么用異步了,-=就是取消對方法參考而已。
大佬 用異步有影響嗎?我也不知道為什么原來的人用異步 可能當時這里比較卡?
uj5u.com熱心網友回復:
是不是有Messenger沒有取消?uj5u.com熱心網友回復:
是不是有Messenger沒有取消?
不清楚 它也像其它界面那樣呼叫事件方法而已
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/96239.html
標籤:C#
