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

我正在尝试为计时器创建一个抽象层。基本上,这个想法是创建一个抽象两个独立计时器的类。基本上,计时器抽象类应该在“关闭”时触发一个事件,在“打开”时触发另一个事件。因此,例如,如果这是一个交通灯,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;

    }

}

}


慕娘9325324
浏览 244回答 1
1回答

慕神8447489

您目前遇到的问题是您的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事件数据和委托处理程序。第二个过程使用自定义数据实现一个事件;它为事件数据和事件委托处理程序定义了自定义类。该教程非常详尽,并且包含大量有关事件的信息(有数据和没有数据)。请随意阅读以进一步了解。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go