在C#中创建“运行一次”时间延迟函数的最佳方法

我试图创建一个接收一个动作和一个超时的函数,并在超时后执行Action。该函数是非阻塞的。该函数必须是线程安全的。我也真的,真的想避免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()不能很好。我不确定是否可以“脱落”的结束,即定时器被认为是活的,而他们的lambdas正在执行,但即使这是这种情况,我宁愿正确处理它。

“火一次延迟”似乎像这样一个常见的问题,应该有一个简单的方法来做这个,可能在System.Threading其他一些库我缺少,但现在我可以想到的唯一的解决方案是修改上面用专门的清理任务运行一段时间。任何建议?

我不知道你使用的C#的哪个版本。但我想你可以通过使用任务库来完成这一任务。它会看起来像这样。

public class PauseAndExecuter
{
    public async Task Execute(Action action, int timeoutInMilliseconds)
    {
        await Task.Delay(timeoutInMilliseconds);
        action();
    }
}
http://stackoverflow.com/questions/5904636/best-way-to-create-a-run-once-time-delayed-function-in-c-sharp

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在C#中创建“运行一次”时间延迟函数的最佳方法