C#:我的应用程序是否可以共享一个';他在我的另一个班里被解雇了?

C#:我的应用程序是否可以共享一个';他在我的另一个班里被解雇了?,c#,events,event-handling,C#,Events,Event Handling,如果我没有正确地解释这一点,请原谅,我是编程新手,如果可能的话,我不太确定它叫什么 首先让我解释一些关于我的班级的事情。我们将这个类称为TextStats。TextStats类创建了如下计时器: private Timer timer; private void OnTimedEvent(object sender, ElapsedEventArgs e) { Console.WriteLine("Timed event has fired!"); }

如果我没有正确地解释这一点,请原谅,我是编程新手,如果可能的话,我不太确定它叫什么

首先让我解释一些关于我的班级的事情。我们将这个类称为TextStats。TextStats类创建了如下计时器:

 private Timer timer;
    private void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("Timed event has fired!");
    }
class TextStats
{ 
    private System.Timers.Timer timer;

    public event EventHandler EventFiresEveryOneSecond;

    public TextStats()
    {
        timer = new System.Timers.Timer(1000);
        timer.Elapsed += OnTimedEvent;
        timer.AutoReset = true;
        timer.Enabled = true;
    }

    private void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        EventFiresEveryOneSecond?.Invoke(sender, e);
    }
}
稍后,这些值在计时器初始化时设置为:

timer = new Timer(1000);
timer.Elapsed += OnTimedEvent;
timer.AutoReset = true;
timer.Enabled = true;
然后我的类中有一个事件每秒都会触发,如下所示:

 private Timer timer;
    private void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("Timed event has fired!");
    }
class TextStats
{ 
    private System.Timers.Timer timer;

    public event EventHandler EventFiresEveryOneSecond;

    public TextStats()
    {
        timer = new System.Timers.Timer(1000);
        timer.Elapsed += OnTimedEvent;
        timer.AutoReset = true;
        timer.Enabled = true;
    }

    private void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        EventFiresEveryOneSecond?.Invoke(sender, e);
    }
}
稍后我将向它添加代码,但基本上我正在尝试重构和清理我的主类中的一些代码

现在,在程序的主类中,我正在为TextStats类创建一个实例,我想它被称为实例:

TextStats textStats = new TextStats();
好了,这就是我被难倒的部分!TextStats类按照我的意愿触发计时器事件,并将在后台运行我的主类中的所有代码。。。。然而,我也希望能够在我的主类中“共享”TextStats的计时器事件

换句话说,我的TextStats类仍然像它应该的那样每秒触发一次计时器事件,但我也想在我的主类中创建一个事件,我的TextStats类中的计时器事件也将触发、共享、背载或附加到。。。不管这个过程叫什么。。。哈哈

我想英文版应该是这样的:

share event OnTimedEvent from textStats and map it to this.TimedEvent;

public void TimedEvent()
{
   //Additional code to run with OnTimedEvent event from class TextStats
}

好的,我已经尽可能清楚地说明了这一点。很抱歉这么长时间的解释。有什么办法可以满足我的要求吗?我不想展示我所有的代码,因为我只是直接跳了进去,我确信一切都一团糟,我不想让人们太分心,只想专注于这一件事。非常感谢你的帮助

您希望两个类共享相同的时钟

至少有两种方法可以做到这一点

  • 简单但以后很难重构:当主窗体
    OnTimedEvent
    启动时,调用
    TextStats
    TimedEvent
  • 要实现它,您需要将
    TextStats
    作为类成员

        // Make your TextStats as a class member.
        TextStats textStats = new TextStats();
        private void OnTimedEvent(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("Timed event has fired!");
            textStats.TimedEvent();
        }
    
  • 将时钟插入
    TextStats
    。这有点复杂,但更容易重构

  • 可以附加到事件的内容称为
    EventHandler
    EventHandler
    s是,表示对另一个方法的引用

    在您的情况下,您可以创建一个
    ElapsedEventHandler
    委托/引用,该委托/引用指向要附加到
    计时器的方法。已用事件进入
    TextStats
    类,然后您可以将其附加到计时器事件:

    class TextStats
    {
        public void AddToTimer(ElapsedEventHandler handler)
        {
            timer.Elapsed += handler;
        }
    }
    
    在主课堂上,您可以执行以下操作:

    var textStats = new TextStats();
    // By doing this, when the timer inside TextStats fires, both OnTimedEvent
    // in TextStats class and AnotherOnTimedEvent in main class will be called.
    textStats.AddToTimer(AnotherOnTimedEvent);
    
    private void AnotherOnTimedEvent(object sender, ElapsedEventArgs e)
    {
    }
    
    调用
    AddToTimer(AnotherOnTimedEvent)
    时,它会传递
    AnotherOnTimedEvent
    方法作为对
    AddToTimer
    方法的引用,在该方法中,该方法作为另一个事件处理程序附加到
    timer.appeased

    注意

    这说明了如何将事件处理程序传递到类中并附加到
    timer.appeased
    概念。但是,当您考虑设计原则时,有更好的解决方案

    例如,您的主类不应该知道
    TextStats
    在内部使用计时器,因为这是一个实现细节。它应该知道的是
    TextStats
    每1秒触发一个事件。因此,更好的方法是让
    TextStats
    公开主类可以附加到的另一个事件,并在
    TextStats
    类中连接这两个事件,因此每当计时器滴答作响时,新事件也会触发

    大概是这样的:

     private Timer timer;
    
        private void OnTimedEvent(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("Timed event has fired!");
        }
    
    class TextStats
    { 
        private System.Timers.Timer timer;
    
        public event EventHandler EventFiresEveryOneSecond;
    
        public TextStats()
        {
            timer = new System.Timers.Timer(1000);
            timer.Elapsed += OnTimedEvent;
            timer.AutoReset = true;
            timer.Enabled = true;
        }
    
        private void OnTimedEvent(object sender, ElapsedEventArgs e)
        {
            EventFiresEveryOneSecond?.Invoke(sender, e);
        }
    }
    
    在你的主课上:

    var textStats = new TextStats();
    textStats.EventFiresEveryOneSecond += AnotherOnTimedEvent;
    
    private void AnotherOnTimedEvent(object sender, EventArgs e)
    {
    }
    

    你想在班级之间共享时钟。一种方法是在两个班级都使用。嘿,路易斯。谢谢你的帮助!我真的很感激!嗨,韦奇!感谢您的回复,并建议在考虑设计原则时处理此问题的替代方法。我都没想过。