Как лучше всего передать несколько параметров методу обратного вызова Threading.Timer?

В последних нескольких моих проектах я сталкивался с ситуациями, когда мне нужно передать несколько параметров методу обратного вызова Threading.Timer . К сожалению, конструктор принимает только один параметр объекта . Не желая использовать глобальные переменные, шаблон, который я начал использовать для решения этой проблемы, состоит в том, чтобы передать анонимный метод при создании таймера и использовать способность компилятора захватывать переменные в моих интересах, например:

public void SendEmailsRepeatedly(IEnumerable<SimpleEmail> emails, int sendRepeatedlyDelayMS)
{
    Tokenizer tokenizer = new StandardTokenizer();

    sendRepeatedlyTimer = new Timer(
        SendRepeatedlyCallback,
        (Action)delegate()
        {
            TokenizeAndSendEmails(emails, tokenizer);
        },
        0,
        sendRepeatedlyDelayMS);
}

private void SendRepeatedlyCallback(object state)
{
    if (!abort)
    {
        Action sendEmails = (Action)state;
        sendEmails();
    }
}

Итак, мой вопрос в том, это вопиющий взлом? Есть ли лучший или рекомендуемый способ сделать это?

7
задан Repo Man 23 November 2011 в 16:11
поделиться