Prism EventAggregator 订阅引用自身以取消订阅的委托

Prism EventAggregator Subscribe to delegate that references itself to Unsubscribe

是否可以这样做:

EventHandler handler = null;
handler = (s, args) =>
{
    DoStuff();
    something.SomeEvent -= handler;
};
something.SomeEvent += handler;

使用 Prism 的 EventAggregator? 即

Action subscriber = null;
subscriber = () =>
{
    DoStuff();
    EventAggregator.GetEvent<SomeEvent>().Unsubscribe(subscriber);
};
EventAggregator.GetEvent<SomeEvent>().Subscribe(subscriber);

是的,这也适用于 Prism 的事件聚合器。这一切都归结为比较两个示例中的代表是否相等。在匿名方法中引用委托并不特定于事件聚合器。

但是,您应该知道,虽然使用匿名方法进行这种一次性事件处理是可行的,因为您持有委托实例 handlersubscriber,订阅到在更复杂的情况下,取消订阅匿名方法可能会非常具有挑战性。您应该查看这两个问题,以了解委托比较如何用于匿名方法。

  • How to remove a lambda event handler
  • Why can't I unsubscribe from an Event Using a Lambda Expression?

作为使用匿名方法的替代方法,您可以使用实例方法或 C# 7.0 中引入的 local functions,如下例所示。

private void AddEventHandler()
{
   // Local method to replace your anonymous method
   void DoStuffAndUnsubscribe()
   {
      DoStuff();
      eventAggregator.GetEvent<SomeEvent>().Unsubscribe(DoStuffAndUnsubscribe);
   }

   eventAggregator.GetEvent<SomeEvent>().Subscribe(DoStuffAndUnsubscribe);
}

正如@Haukinger指出的那样,最简洁的方法是在匿名方法中捕获事件订阅令牌的实例以使用Dispose().

取消订阅
IDisposable subscriptionToken = null;
subscriptionToken = eventAggregator.GetEvent<SomeEvent>().Subscribe(() =>
{
    DoStuff();
    subscriptionToken.Dispose();
});

Subscribe returns 一个您可以取消订阅的订阅对象:

IDisposable subscription = null;
subscription = eventAggregator.GetEvent<SomeEvent>().Subscribe( () =>
                                                                {
                                                                    // do something
                                                                    subscription.Dispose();
                                                                } );