如何订阅已提升的活动并一起打印?

我一直在研究一个有3个类的程序,其中2个类具有以不同间隔重复的定时器,并且一旦定时器的一个“循环”完成,它就会引发一个带有字符串作为返回的事件。 第3类从其他两个计时器类订阅事件并将它们打印到屏幕。 它很棒!

但我的问题是它是单独打印它们。 让我们说第一个计时器类运行,然后每隔2分钟发出一次“hello”,另一个类“dog”每秒发出一次,每次发生一个事件时它都会将引发的事件打印到控制台。 我希望它反而每秒打印“hellodog”并将第一个计时器(你好)的值存储在一个私有字段或其他东西,所以它仍然打印到屏幕,即使计时器(较慢的2分钟计时器)还没有被解雇。 当2分钟计时器触发时,它会将值更新为新的值,并将新值打印到屏幕,直到它再次触发。

如果令人困惑,我会很乐意澄清。 有点难以解释。

namespace Final { public class Output { public static void Main() { var timer1 = new FormWithTimer(); var timer2 = new FormWithTimer2(); timer1.NewStringAvailable += new EventHandler(timer1_NewStringAvailable); timer2.NewStringAvailable += new EventHandler(timer2_NewStringAvailable); Console.ReadLine(); } static void timer1_NewStringAvailable(object sender, BaseClassThatCanRaiseEvent.StringEventArgs e) { var theString = e.Value; //To something with 'theString' that came from timer 1 Console.WriteLine(theString); } static void timer2_NewStringAvailable(object sender, BaseClassThatCanRaiseEvent.StringEventArgs e) { var theString2 = e.Value; //To something with 'theString2' that came from timer 2 Console.WriteLine(theString2); } } public abstract class BaseClassThatCanRaiseEvent { public class StringEventArgs : EventArgs { public StringEventArgs(string value) { Value = value; } public string Value { get; private set; } } //The event itself that people can subscribe to public event EventHandler NewStringAvailable; protected void RaiseEvent(string value) { var e = NewStringAvailable; if (e != null) e(this, new StringEventArgs(value)); } } public partial class FormWithTimer : BaseClassThatCanRaiseEvent { Timer timer = new Timer(); public FormWithTimer() { timer = new System.Timers.Timer(200000); timer.Elapsed += new ElapsedEventHandler(timer_Tick); // Everytime timer ticks, timer_Tick will be called timer.Interval = (200000); // Timer will tick evert 10 seconds timer.Enabled = true; // Enable the timer timer.Start(); // Start the timer } void timer_Tick(object sender, EventArgs e) { ... RaiseEvent(gml.ToString()); } } public partial class FormWithTimer2 : BaseClassThatCanRaiseEvent { Timer timer = new Timer(); public FormWithTimer2() { timer = new System.Timers.Timer(1000); timer.Elapsed += new ElapsedEventHandler(timer_Tick2); // Everytime timer ticks, timer_Tick will be called timer.Interval = (1000); // Timer will tick evert 10 seconds timer.Enabled = true; // Enable the timer timer.Start(); // Start the timer } void timer_Tick2(object sender, EventArgs e) { ... RaiseEvent(aida.ToString()); } } } 

您可以为两个计时器使用相同的事件处理程序。 并通过识别发件人来构建输出。 (没有测试代码是否存在语法错误。)

 private static string timer1Value = string.Empty; private static string timer2Value = string.Empty; private static FormWithTimer timer1; private static FormWithTimer2 timer2; public static void Main() { timer1 = new FormWithTimer(); timer2 = new FormWithTimer2(); timer1.NewStringAvailable += new EventHandler(timer1_NewStringAvailable); timer2.NewStringAvailable += new EventHandler(timer1_NewStringAvailable); Console.ReadLine(); } static void timer1_NewStringAvailable(object sender, BaseClassThatCanRaiseEvent.StringEventArgs e) { if (sender == timer1) { timer1Value = e.Value.ToString(); } else if (sender == timer2) { timer2Value = e.Value.ToString(); } if (timer1Value != String.Empty && timer2Value != String.Empty) { Console.WriteLine(timer1Value + timer2Value); // Do the string concatenation as you want. } 

如果我误解了这个问题,请纠正我,但听起来你想要协调你对两个计时器事件的反应(打印“hellodog”)。

在我看来,最简单的方法是只使用一个计时器,并让计时器的事件处理程序计算调用处理程序的次数,以决定是否采取每秒一次的操作,或者采取每两分钟一次的行动。

由于慢速计时器是快速计时器的精确倍数,因此您只需设置一个每秒触发的计时器,并且每1次计时器的120次调用(120秒= 2分钟)也会执行2分钟的操作。

我想我明白你想要什么,那就是同步两个计时器的输出。 我担心除了勉强通过之外别无他法。 设置一组布尔变量,用于跟踪是否触发了每个事件以及是否将同步消息发送到输出。

这应该做你想要的。

  public static void Main() { var timer1 = new FormWithTimer(); var timer2 = new FormWithTimer2(); var value1 = ""; var value2 = ""; Action writeValues = () => Console.WriteLine(value1 + value2); timer1.NewStringAvailable += (s, e) => { value1 = e.Value; writeValues(); }; timer2.NewStringAvailable += (s, e) => { value2 = e.Value; writeValues(); }; Console.ReadLine(); } 

如果这是对的,请告诉我。 干杯。

第二个(更快)计时器应该是唯一一个打印的计时器。 第一个(较慢的)计时器应该只更新第二个计时器将使用的字符串。

在’Output’类中(你可以把它放在Main之前):

 string string1; 

然后:

 static void timer1_NewStringAvailable(object sender, BaseClassThatCanRaiseEvent.StringEventArgs e) { string1 = e.Value; } static void timer2_NewStringAvailable(object sender, BaseClassThatCanRaiseEvent.StringEventArgs e) { var theString2 = e.Value; //To something with 'theString2' that came from timer 2 Console.WriteLine(string1 + theString2); }