我一直在研究一个有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<BaseClassThatCanRaiseEvent.StringEventArgs>(timer1_NewStringAvailable);
timer2.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(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<StringEventArgs> 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());
}
}
}
答案 0 :(得分:1)
如果我误解了这个问题,请纠正我,但听起来你想要协调你对两个计时器事件的反应(打印“hellodog”)。
在我看来,最简单的方法是使用单个计时器,并让计时器的事件处理程序计算处理程序被调用的次数,以决定是否采取每秒一次的操作,或者也采取每两分钟一次的行动。
由于慢速计时器是快速计时器的精确倍数,因此您只需设置一个每秒触发的计时器,并且每1次计时器的120次调用也会执行2分钟的操作(120秒= 2分钟)
答案 1 :(得分:1)
我想我明白你想要什么,那就是同步两个计时器的输出。我担心除了通过它之外别无他法。设置一组布尔变量,跟踪是否触发了每个事件以及是否将同步消息发送到输出。
答案 2 :(得分:1)
您可以为两个计时器使用相同的事件处理程序。并通过识别发件人来构建输出。 (没有测试代码是否存在语法错误。)
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<BaseClassThatCanRaiseEvent.StringEventArgs>(timer1_NewStringAvailable);
timer2.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(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.
}
答案 3 :(得分:1)
这应该做你想要的。
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();
}
如果这是对的,请告诉我。欢呼声。
答案 4 :(得分:1)
第二个(更快)计时器应该是唯一要打印的计时器。 第一个(较慢的)计时器应该只更新第二个计时器将使用的字符串。
在“输出”类中(您可以将它放在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);
}