C#:我的应用程序是否可以共享一个';他在我的另一个班里被解雇了?
如果我没有正确地解释这一点,请原谅,我是编程新手,如果可能的话,我不太确定它叫什么 首先让我解释一些关于我的班级的事情。我们将这个类称为TextStats。TextStats类创建了如下计时器: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!"); }
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)
{
}
你想在班级之间共享时钟。一种方法是在两个班级都使用。嘿,路易斯。谢谢你的帮助!我真的很感激!嗨,韦奇!感谢您的回复,并建议在考虑设计原则时处理此问题的替代方法。我都没想过。