包含带有计时器的对象的字典.需要找出哪个对象的计时器正在调用已经过的事件

本文关键字:计时器 对象 调用 经过 事件 字典 包含带 | 更新日期: 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

则可以通过此属性

过滤已经过的民意调查