使lambda事件订阅者仅触发一次,然后将其删除

时间:2019-07-28 05:55:48

标签: c# events lambda

这个想法是我想用函数调用的当前变量状态生成一个闭包,并订阅一个事件。引发事件后,然后删除闭包。这意味着它只是一次性订阅者,可以随时取消。

此外,我希望订户始终订阅该事件并且不被删除,任何想法如何实现?还是有其他方法可以做到这一点?谢谢!

{{1}}

1 个答案:

答案 0 :(得分:1)

您当前的代码有几个问题:

  • 当您应使用事件本身(即OnEventRaise)时,您正在使用process订阅事件。
  • 您使用lambda初始化操作showName的语法不正确。您需要使用Action showName = () => { // ... };

最后,要取消订阅该事件,您可以在动作主体内简单地使用a.process -+ showName;,但是您需要首先对其进行初始化,以防止编译器抱怨。

为您的B类尝试类似的操作:

public class B
{
    // subscribe the closure and delete it once it is invoked, can unsubscribe at anytime.
    void subscribe(A a)
    {
        string name = "one shot subscriber";
        Action showName = null;
        showName = () =>
        {
            print(name);
            a.process -= showName;
        };
        a.process += showName;
    }

    private void print(string s)
    {
        // ....
    }
}