gpt4 book ai didi

c# - 使 lambda 事件订阅者只触发一次然后将其删除

转载 作者:太空宇宙 更新时间:2023-11-03 12:00:33 25 4
gpt4 key购买 nike

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

此外,我希望订阅者始终订阅事件而不被删除,知道如何实现吗?还是有其他方法可以实现这一目标?谢谢!

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;
}
}

最佳答案

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

  • 您使用 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)
{
// ....
}
}

关于c# - 使 lambda 事件订阅者只触发一次然后将其删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57238334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com