亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從另一個事件調用一個事件

從另一個事件調用一個事件

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 關注
  • 275 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號