В последних нескольких моих проектах я сталкивался с ситуациями, когда мне нужно передать несколько параметров методу обратного вызова 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();
}
}
Итак, мой вопрос в том, это вопиющий взлом? Есть ли лучший или рекомендуемый способ сделать это?