Обновление
Думая о своей проблеме немного более широко, я думаю, что то, чего вы на самом деле пытаетесь достичь, достижимо гораздо проще, без использования System.Threading.Timer
вообще.
Это в основном то, что вы хотите, чтобы ваш метод делал? Выполнить action
через указанное количество миллисекунд? Если это так, я бы предложил что-то вроде следующей альтернативной реализации:
private void Delay(Action action, int ms)
{
if (ms <= 0)
{
action();
return;
}
System.Threading.WaitCallback delayed = state =>
{
System.Threading.Thread.Sleep(ms);
action();
};
System.Threading.ThreadPool.QueueUserWorkItem(delayed);
}
... кстати, знаете ли вы, что в размещенном вами коде указание ненулевого значения для ms
приведет к тому, что action
будет выполнен дважды?
Оригинальный ответ
Класс timerstate
действительно не нужен. Просто добавьте член System.Threading.Timer
в любой класс, содержащий ваш метод Delay
; тогда ваш код должен выглядеть так:
public class Delayer
{
private System.Threading.Timer _timer;
private void Delay(Action action, Int32 ms)
{
if (ms <= 0)
{
action();
}
_timer = new System.Threading.Timer(
(o) => action(),
null,
ms,
System.Threading.Timeout.Infinite);
}
}
Теперь я вижу, что вы указываете аргумент period
конструктора таймера как System.Threading.Timeout.Infinite
(-1). Это означает, что вы собираетесь, чтобы таймер вызывал action
один раз , после того как ms
истекло; я прав? Если это так, то на самом деле нет особой необходимости беспокоиться о том, чтобы таймер был установлен в любом случае (то есть будет, и это нормально), принимая относительно низкое значение для ms
.
В любом случае, если вы собираетесь удерживать экземпляр объекта IDisposable
(например, System.Threading.Timer
), вы, как правило, должны распоряжаться этим членом, когда ваш объект (т. Е. Этот экземпляр) утилизируется. Я полагаю, что у System.Threading.Timer
есть финализатор, который в конечном итоге приведет к его удалению, но лучше утилизировать вещи, как только они вам больше не понадобятся. Итак:
public class Delayer : IDisposable
{
// same code as above, plus...
public void Dispose()
{
_timer.Dispose();
}
}