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

从另一个事件调用一个事件

从另一个事件调用一个事件

Go
慕娘9325324 2021-11-07 19:12:27
我正在尝试为计时器创建一个抽象层。基本上,这个想法是创建一个抽象两个独立计时器的类。基本上,计时器抽象类应该在“关闭”时触发一个事件,在“打开”时触发另一个事件。因此,例如,如果这是一个交通灯,timer1 将控制绿灯,timer2 将控制红灯(让我们忽略黄色)。如您所见,timer1_Elapsed并timer2_Elapsed处理计时器的“菊花链”。在这些事件发生后,我想要另一个事件(这个计时器的真正目的)发生。问题似乎是 myEvent1和Event2 ElapsedEventHandlers 似乎没有按预期工作。我收到以下错误: 'TwoCycleTimer.Event1.get' must declare a body because it is not marked abstract, extern, or partial同样的事情Event2我应该注意,声明一个 bodyget什么也没做,只会让事情变得更糟。get {return timer1.Elapsed; };导致 can only appear on the left hand side of += or =错误using System;using System.Timers;public class TwoCycleTimer{    private Boolean enabled;        private Timer timer1;    private Timer timer2;public Boolean Enabled{    get { return enabled; }    set     {        timer1.Enabled = value;        enabled = value;    }}public double Interval1{    get { return timer1.Interval; }    set { timer1.Interval = value; }}public double Interval2{    get { return timer2.Interval; }    set { timer2.Interval = value; }}public ElapsedEventHandler Event1 { get; set { timer1.Elapsed += value; } }public ElapsedEventHandler Event2 { get; set { timer2.Elapsed += value; } }public TwoCycleTimer(bool Enabled = false, double Interval1 = 4000, double Interval2 = 60000, ElapsedEventHandler Event1 = null, ElapsedEventHandler Event2 = null){    timer1 = new Timer(Interval1);    timer2 = new Timer(Interval2);    timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);    timer2.Elapsed += new ElapsedEventHandler(timer2_Elapsed);    if(Event1 != null)        timer1.Elapsed += Event1;    if(Event2 != null)        timer2.Elapsed += Event2;    this.Enabled = enabled;}private void timer1_Elapsed(object source, ElapsedEventArgs e){    if (Enabled)    {        timer1.Enabled = false;        timer2.Enabled = true;    }}private void timer2_Elapsed(object source, ElapsedEventArgs e){    if (Enabled)    {        timer2.Enabled = false;        timer1.Enabled = true;    }}}
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

您目前遇到的问题是您的set访问者有一个主体,但不是get(有关基础知识,请参阅此帖子)。根据我的理解(和文档),任何一个带有事件的访问器中都不需要主体(我也不认为这是允许的)。实现您的目标的最简单的解决方案是私下引发计时器事件(这应该是默认值)并使用这些事件来调用您的自定义事件:


using System.Timers;

internal class DualTimer {


    #region Fields


    private Timer leftTimer;

    private Timer rightTimer;


    #endregion


    #region Events


    public event EventHandler LeftTick;

    public event EventHandler RightTick;


    #endregion


    #region Constructor(s)


    public DualTimer(int leftInterval, int rightInterval) {

        leftTimer = new Timer(leftInterval);

        rightTimer = new Timer(rightInterval);

        leftTimer.Elapsed += leftTimer_Elapsed;

        rightTimer.Elapsed += rightTimer_Elapsed;

    }


    #endregion


    #region Public Methods


    public void Start() {

        leftTimer.Start();

        rightTimer.Start();

    }

    public void Stop() {

        leftTimer.Stop();

        rightTimer.Stop();

    }


    #endregion


    #region Private Methods


    private void leftTimer_Elapsed(object sender, EventArgs e) {

        LeftTick(sender, e);

    }

    private void rightTimer_Elapsed(object sender, EventArgs e) {

        RightTick(sender, e);

    }


    #endregion


}

这将隐藏各个计时器的事件,因为它们是类的私有对象。当它们的 elapsed 事件被引发时,你的左右滴答事件将分别被引发。这可以很容易地扩展以添加您的黄灯(顺便说一下,这是一个很好的类比)。这个类的实现非常简单:


static DateTime startTime;

static void Main(string[] args) {

    DualTimer t = new DualTimer(100, 250);

    t.LeftTick += T_LeftTick;

    t.RightTick += T_RightTick;

    startTime = DateTime.Now;

    t.Start();

    Console.ReadKey();

    t.Stop();

}

private static void T_LeftTick(object sender, EventArgs e) {

    Console.WriteLine($"Right side tick. {DateTime.Now - startTime}");

}

private static void T_RightTick(object sender, EventArgs e) {

    Console.WriteLine($"Left side tick. {DateTime.Now - startTime}");

}

关于这个问题的一个很好的读物是在你的类中实现事件的MSDN教程。


以下过程描述了如何在类中实现事件。第一个过程实现了一个没有关联数据的事件;它使用类System.EventArgs和System.EventHandler事件数据和委托处理程序。第二个过程使用自定义数据实现一个事件;它为事件数据和事件委托处理程序定义了自定义类。


该教程非常详尽,并且包含大量有关事件的信息(有数据和没有数据)。请随意阅读以进一步了解。


查看完整回答
反对 回复 2021-11-07
  • 1 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

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