Я пытаюсь создать функцию, которая принимает действие и тайм-аут и выполняет действие после тайм-аута. Функция должна быть неблокирующей. Функция должна быть поточно-ориентированной. Я также очень, очень хочу избежать Thread.Sleep ().
Пока лучшее, что я могу сделать, это:
long currentKey = 0;
ConcurrentDictionary<long, Timer> timers = new ConcurrentDictionary<long, Timer>();
protected void Execute(Action action, int timeout_ms)
{
long currentKey = Interlocked.Increment(ref currentKey);
Timer t = new Timer(
(key) =>
{
action();
Timer lTimer;
if(timers.TryRemove((long)key, out lTimer))
{
lTimer.Dispose();
}
}, currentKey, Timeout.Infinite, Timeout.Infinite
);
timers[currentKey] = t;
t.Change(timeout_ms, Timeout.Infinite);
}
Проблема в том, что вызов Dispose () из самого обратного вызова не может быть хорошим. Я не уверен, безопасно ли «падать» с конца, то есть таймеры считаются живыми, пока выполняются их лямбды, но даже если это так, я бы предпочел правильно распоряжаться им.
«Один выстрел с задержкой» кажется такой распространенной проблемой, что должен быть простой способ сделать это, возможно, какая-то другая библиотека в System.Threading, которую я пропускаю, но сейчас единственное решение, которое я могу придумать является модификацией вышеупомянутого с выделенной задачей очистки, выполняющейся с интервалом. Любой совет?