C# 事件和委托 - 如何延迟调用事件的订阅者?

C# Events and Delegates - How do I delay an event's subscriber from being called?

提问人:Lnio Yarschov 提问时间:9/3/2023 更新时间:9/3/2023 访问量:29

问:

我了解了事件和委托,这里有一个简单的例子:

public class Subject {
  public delegate void RandomDelegate();
  public event RandomDelegate randomEvent;
  void CallRandom() {
    if (randomEvent != null) {randomEvent();}
  }
}

我可以,每当调用randomEvent时进行处理。但是,我如何处理延迟事件处理程序,该处理程序在订阅后调用第n次randomEvent,并在之后删除自身? 我试着做一个类来做这件事,但我很困惑。Subject.randomEvent += randomEventHandler;

public class DelayedHandler
{
    
    public int CurrentDelay { get; private set; } = 0;
    public int Delay { get; init; }

    public DelayedHandler(int delay)
    {
        Delay = delay;
    }

    public void Handler() // randomEvent += new DelayedHandler().Handler
    {
        if (CurrentDelay >= Delay)
        {
            // Logic
        }
        else
        {
            CurrentDelay++;
        }
    }
}
C# 事件 委托

评论

0赞 jmcilhinney 9/3/2023
如果你想在第 n 次做某事,那么你需要一个计数器变量,你递增该变量,然后在它达到 n 时采取行动。问题在于,您是只关心满足先决条件的次数,还是还关心事件处理程序的注册时间。如果只想在注册事件处理程序后开始计数,则需要能够检测事件处理程序的注册时间,这通常不能,但可以做到。
0赞 Fildor 9/3/2023
听起来您可能对 Rx(反应式扩展)感兴趣?
0赞 Fildor 9/3/2023
我认为你已经非常接近你的实现。不过,我想说的是,这些属性都不需要公开。我还会让 ctor 进行回调(我猜你想在第 n 次实际做某事)和对你为事件注册的实例的引用。然后你就拥有了你需要的一切。对事件进行计数,当达到阈值时,取消注册,调用回调并清理资源。
0赞 Fildor 9/3/2023
当然,您可以依次发出另一个事件,而不是回调。

答: 暂无答案