2011-01-30 41 views
3

我有一個TestEvent類匿名過濾委託解僱沒有被解僱。但是,如果我這樣認購它:棱鏡CompositeEvent不與助手類指定

eventAggregator.GetEvent<TestEvent>().Subscribe(_ => MessageBox.Show("Hi"), ThreadOption.PublisherThread, false, arg => arg.Equals(3)); 

它'火'。儘管在概念上,從句法和邏輯上都是相似的。唯一的區別是第一個使用事件類中的助手方法來訂閱事件。

我敢肯定,這是關於由CompositeEvent類保留的委託的弱引用相關的事情,因爲如果我在訂閱調用中設置keepSubscriberAlive = true(第三個參數),第一個工作。我不能只用這個解決方案,因爲我不知道它會保持活力的是什麼?這會是訂閱該活動的班級嗎?如果是這樣的話,那麼即使沒有傳遞錯誤,這個班還活着,那麼爲什麼這個事件在第一種情況下不會被解僱/處理?

任何人都可以解釋這種行爲嗎?

回答

3

在第一個示例中,代碼捕獲傳遞給TestEvent方法的變量。在這種情況下,編譯器需要創建一個包裝數字的類。每次調用TestEvent的Subscribe時,都應該實例化這個類的新實例。

在第二個示例中沒有要捕獲的數據,因此可以將傳遞給Subscribe的委託設爲靜態。在這種情況下,它將在域卸載之前生存。