包含带有计时器的对象的字典.需要找出哪个对象的计时器正在调用已经过的事件
本文关键字:计时器 对象 调用 经过 事件 字典 包含带 | 更新日期: 2023-09-27 18:10:18
我有这个民意调查类
class Poll
{
public string question { get; set; }
public Timer pollTimer { get; set; }
public List<string> userVoted { get; set; }
public Dictionary<string, int> choices { get; set; }
public bool PollRunning { get; set; }
public Poll(string question,Dictionary<string,int> choices)
{
this.question = question;
this.choices = choices;
this.pollTimer = new Timer(15000);
this.PollRunning = true;
this.userVoted = new List<string>();
}
public string pollResults()
{
string temp = "";
foreach (KeyValuePair<string, int> keyValuePair in choices)
{
temp = temp + keyValuePair.Key + " " + keyValuePair.Value + ", ";
}
return string.Format("Poll Results: {0}", temp);
}
}
我在StartPool方法
中有这段代码 static Dictionary<Channel, Poll> polls = new Dictionary<Channel, Poll>();
public void startPool(Channel channel)
{
polls.Add(channel, new Poll(question, tempdict));
polls[channel].pollTimer.Elapsed += new ElapsedEventHandler(pollTimer_Elapsed);
polls[channel].pollTimer.Start();
}
当这个方法被调用时
static void pollTimer_Elapsed(object sender, ElapsedEventArgs e)
{
//do stuff to the poll that called this.
}
我需要知道什么poll对象的计时器正在调用这个方法所以我可以执行polls[channel].pollTimer.Stop();[channel].pollResults();
因为它是我不知道哪个投票停止和张贴结果时,这运行
我愿意贴出整个解决方案,如果这将有助于你帮助我。
您设计Poll类的方式存在的问题是,Poll类没有完全完成它的工作。您需要其他类知道如何启动和停止轮询,这意味着一半的轮询实现在Poll类内部,另一半实现在Poll类外部。如果你要创建一个Poll类,隐藏所有的实现细节。
这就是我的意思。我将在Poll中创建一个事件,像这样:
public event EventHandler<ElapsedEventArgs> Elapsed;
在Poll的构造函数中,添加这一行:
this.pollTimer.Elapsed += pollTimer_elapsed;
和pollTimer_elapsed看起来像这样:
private void pollTimer_elapsed(object sender, ElapsedEventArgs e)
{
var han = this.Elapsed;
if (han != null)
han(this, e); // Fire the Elapsed event, passing 'this' Poll as the sender
}
在Poll中添加一个新的公共方法来启动计时器:
public void Start()
{
this.pollTimer.Start();
}
现在你的startPool方法是这样的:
public void startPool(Channel channel)
{
polls.Add(channel, new Poll(question, tempdict));
polls[channel].Elapsed += poll_Elapsed;
polls[channel].Start();
}
static void poll_Elapsed(object sender, ElapsedEventArgs e)
{
//sender is now a Poll object
var poll = sender as Poll;
// Now you can do poll.pollTimer.Stop()
// Or better yet, add a Stop method to the Poll class and call poll.Stop()
}
我认为这种方法稍微好一点,因为Poll对象对外部对象隐藏了更多的实现。从startPool的角度来看,Poll类更容易使用,并且您也不需要Poll类之外的任何东西来了解计时器。
你可以添加一个属性:public bool pollTimerElapsed {get;设置;}
并在pollTimer的Poll of Elapsed event的构造器中订阅处理程序,其中您将属性pollTimerElapsed设置为true
则可以通过此属性