确保我们只为活动订阅一次

时间:2011-04-13 10:59:00

标签: c# events

这是我的问题:如果我想确保处理程序只订阅一次,以这种方式订阅是否正确:

x.Event -= Handler;
x.Event += Handler;

想法是“尝试取消订阅,即使我们没有订阅”,然后在我们100%未订阅的情况下订阅。

这个想法是否正确,如果没有 - 为什么?用Google搜索了一段时间,似乎无法自己找到答案。

2 个答案:

答案 0 :(得分:4)

只要你无处不在你订阅了那个处理程序,它应该没问题。但是,如果您订阅了100次然后运行该代码,那么您仍然会留下100个订阅。

(顺便说一句,我假设你只使用一个线程。如果两个线程同时执行该代码,则存在竞争条件......他们都可以取消订阅然后两个订阅,留下两个活动订阅。)

答案 1 :(得分:4)

你所拥有的东西不会抛出任何异常,因此它会按预期工作 - 但代码不是很清楚。

我非常喜欢使用布尔标志进行测试:

if(!subscribed) {
    x.Event += Handler;
}