Словарь, содержащий объекты с таймерами.Необходимо выяснить, какой таймер объекта вызывает истекшее событие - PullRequest
2 голосов
/ 02 октября 2011

У меня есть этот класс опроса

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.
    }

Мне нужно знать, какой таймер объекта опроса вызывает этот метод. так что я могу делать опросы [канал] .pollTimer.Stop (); и делать опросы [канал] .pollResults ();

Так как я понятия не имею, какой опрос остановить и опубликовать результаты, когда он запускается

Я готов опубликовать полное решение, если это поможет вам помочь мне.

Ответы [ 2 ]

3 голосов
/ 02 октября 2011

Проблема с тем, как вы разработали класс Poll, заключается в том, что класс Poll не полностью выполняет свою работу.Вам необходимо, чтобы другие классы знали, как запускать и останавливать опрос, то есть половина реализации опроса находится внутри класса Poll, а половина реализации находится вне класса Poll.Если вы собираетесь создать класс Poll, спрячьте ВСЕ детали реализации от всех остальных.

Вот что я имею в виду.Я бы создал событие в опросе так:

public event EventHandler<ElapsedEventArgs> Elapsed;

В конструкторе опроса добавьте эту строку:

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
}

Добавьте новый открытый метод в опросе для запуска таймера:

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()
}

ИМХО, этот подход немного лучше, потому что опросОбъект скрывает большую часть своей реализации от внешних объектов.С точки зрения startPool, класс Poll проще в использовании, и вам также не нужно ничего знать о таймерах за пределами вашего класса Poll.

0 голосов
/ 02 октября 2011

Вы можете добавить недвижимость: public bool pollTimerElapsed {get; задавать; }

и подпишитесь на обработчик в contsructeur Poll of Elapsed для события pollTimer, в котором для свойства true установлено значение pollTimerElapsed

тогда вы можете отфильтровать прошедшие опросы по этому свойству

...