为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
弑天下 2023-07-22 16:19:54
我的想法是,我想用函数调用的当前变量状态生成一个闭包,并订阅一个事件。引发事件后,然后删除闭包。这意味着它只是一次性订阅者,并且可以随时取消。另外,我希望订阅者始终订阅该事件并且不会被删除,知道如何实现这一点吗?或者还有其他方法可以实现这一目标吗?谢谢!public class A{    public event Action process;    // publisher.    void OnEventRaise()    {        process?.Invoke();    }}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 = () =>        {            print(name);        }        a.process += showName;    }}public class C{    // this is always subscribed to the event.    void EventCallBack()    {        print("always subscribed");    }    void subscribe(A a)    {        a.process += EventCallBack;    }}
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

您当前的代码存在几个问题:

  • 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)

    {

        // ....

    }

}


查看完整回答
反对 回复 2023-07-22
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信