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 的事件聚合器。这一切都归结为比较两个示例中的代表是否相等。在匿名方法中引用委托并不特定于事件聚合器。
但是,您应该知道,虽然使用匿名方法进行这种一次性事件处理是可行的,因为您持有委托实例 handler
或 subscriber
,订阅到在更复杂的情况下,取消订阅匿名方法可能会非常具有挑战性。您应该查看这两个问题,以了解委托比较如何用于匿名方法。
- 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();
} );
是否可以这样做:
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 的事件聚合器。这一切都归结为比较两个示例中的代表是否相等。在匿名方法中引用委托并不特定于事件聚合器。
但是,您应该知道,虽然使用匿名方法进行这种一次性事件处理是可行的,因为您持有委托实例 handler
或 subscriber
,订阅到在更复杂的情况下,取消订阅匿名方法可能会非常具有挑战性。您应该查看这两个问题,以了解委托比较如何用于匿名方法。
- 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();
} );