我必须动态创建几个计时器,但是当它们触发时我需要它们的名称。
这是我的代码:
timersDict = new Dictionary<string, System.Timers.Timer>();
int i = 0;
foreach (var msg in _messages.CurrentMessages)
{
var timer = new System.Timers.Timer();
timer.Interval = int.Parse(msg.Seconds);
timer.Elapsed += Main_Tick;
timer.Site.Name = i.ToString();
i++;
}
我以为我可以从timer.Site.Name
设置它,但我在网站上获得了一个空例外。
如何设置我正在创建的计时器的名称?
修改
我正在创建这个,因为我需要知道什么计时器在到达已用事件时触发。我必须知道一旦它发射就会显示什么信息。
我可以使用计时器传递消息,并根据它是什么计时器显示消息吗?
以下是我的其余代码:
void Main_Tick(object sender, EventArgs e)
{
var index = int.Parse(((System.Timers.Timer)sender).Site.Name);
SubmitInput(_messages.CurrentMessages[index].MessageString);
}
我打算用它的名字来告诉我它是哪个计时器所以我知道要显示什么消息,因为所有计时器都是动态创建的。
答案 0 :(得分:2)
我建议包装System.Timers.Timer类并添加您自己的名称字段。
以下是一个例子:
using System;
using System.Collections.Generic;
using System.Threading;
namespace StackOverFlowConsole3
{
public class NamedTimer : System.Timers.Timer
{
public readonly string name;
public NamedTimer(string name)
{
this.name = name;
}
}
class Program
{
static void Main()
{
for (int i = 1; i <= 10; i++)
{
var timer = new NamedTimer(i.ToString());
timer.Interval = i * 1000;
timer.Elapsed += Main_Tick;
timer.AutoReset = false;
timer.Start();
}
Thread.Sleep(11000);
}
static void Main_Tick(object sender, EventArgs args)
{
NamedTimer timer = sender as NamedTimer;
Console.WriteLine(timer.name);
}
}
}