我做了一個串口的dll,然后單例實體化,來應對不同頁面間呼叫的情況,但對接收資料處理的事件注冊是在每個頁面中,結果導致A頁面注冊事件后,打開B頁面時,B頁面再次注冊,就有了兩個事件回應。B頁面有不同處理,所以必須要注冊一下,同時我也不想在每個頁面中做事件注銷,請問有什么方式可以把事件的注銷寫在單例里嗎?或者其他解決方式,但最好不是每個頁面單獨寫
uj5u.com熱心網友回復:
為什么要這么設計?既然設計了事件,則呼叫方注冊事件(即訂閱)就必然涉及到相應的注銷,因為被注冊方無法知道應該什么時候注銷。uj5u.com熱心網友回復:
該動筷子就得動筷子,沒人會喂給你啊就算俺們包裝變成
using(代理訪問包裝器 xx=new 代理訪問包裝器(Action xx))
{
}
也得得自己寫個包裝器,自己在Disposable 方法里去-=他
在說了,A打開,B打開這種描述。你覺著我們怎么知道B打開,A就不用了呢??然后我切換到A,是不是B就不用了??
如果說是這樣,包裝器帶個激活動作。
可是問題來了,我就不想寫-=,那么我們說估計你連激活都不想寫的。所以基本無解,是我們讓計算機動作,不是計算機自己喂飯給你的
uj5u.com熱心網友回復:
I訊息處理介面 tagetobject {get;set;}你的串口訊息到達
{
tagetobject?.invoke(訊息)
}
當然激活動作,給tagetobject賦值激活,你還是得寫得。當然這是一個就事論事得寫法,反正你要求就是同時就一個目標去處理,這個滿足你得要求
uj5u.com熱心網友回復:
剛看了一本書《》上提到了弱委托的概念,可以參考參考:在使 用事 件 編程 時, 如果 一個 事件 注冊 者 向 事件 發布者 注冊 了 一個 事件, 那么 發布者 就會 對 注冊 者 保存 一個 強 參考。 如果 事件 注冊 者 未 正確地 注銷 事件, 那么 發布者 的 委托 鏈 表中 就 一直 包含 一個 對 該 注冊 者 的 強 參考。 這樣一來, 注冊 者 在 堆 中的 記憶體 永遠 都不 會被 CLR 回收, 如果 這樣 的 注冊 者 屬于 大 物件 或者 數目 眾多, 很輕 易 就會 造 成堆 中 記憶體 不足。 弱 委托 就 恰好 能夠 解決 這個 問題, 只要 我們將 事件 編程 中 用到 的 委托 替換 為 弱 委托 即可。
周見智; 博圖軒. 修煉之道:.NET開發要點精講 (Kindle 位置 2136-2140). 清華大學出版社. Kindle 版本.
uj5u.com熱心網友回復:
首先用“正常的思維邏輯”來撰寫程式,不要繞過分技術的東西來畫蛇添足,如無必要不要引入技術。你的生命期段的物件,把自己的參考注冊給生命期非常長的物件的事件,那么你在關閉短期物件、呼叫相關關閉方法時為什么不注銷事件監聽呢?完全沒有道理。
uj5u.com熱心網友回復:
你的事件處理方法本來就是每一種類頁面里邊的代碼,什么叫做“寫道單例里”呢?如果腦袋都安錯位了,那么也就沒有形了。
uj5u.com熱心網友回復:
非要這么做的話,另外做一個注冊函式,增加一個引數參考頁面,將頁面與函式映射起來,觸發事件的時候檢查每個注冊事件對應的頁面是否還有效uj5u.com熱心網友回復:
受教了,謝謝大家轉載請註明出處,本文鏈接:https://www.uj5u.com/net/17966.html
標籤:C#
上一篇:C# 資料庫自增的列
下一篇:jquery 截取字串中的字符
