微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不可重入C#计时器

我正在尝试每t个时间调用一个方法f(),但是如果之前的f()调用尚未完成,请等待完成.

我已经读了一些可用的计时器(this is a useful link),但找不到任何好的方式来做我想要的,除了手动编写所有这些.任何关于如何实现这一点的帮助将不胜感激,尽管我担心我可能无法使用计时器找到一个简单的解决方案.

为了澄清,如果t是一秒钟,f()运行我在下面写的任意持续时间,那么:

Step  Operation    Time taken
1     wait         1s
2     f()          0.6s
3     wait         0.4s (because f already took 0.6 seconds)
4     f()          10s
5     wait         0s (we're late)
6     f()          0.3s
7     wait         0.7s (we can disregard the debt from step 4)

请注意,这个定时器的性质是f()对于重新进入而言不需要安全,而在这里,大小为1的线程池就足够了.

解决方法

你可以使用一个’全局’级别的var(或更有可能的是与f()相同的类中的一个public属性),如果f()已经在运行,则返回true.

因此,如果f()在一个名为TimedEvent的类中,则f()将首先设置为运行true

这样你的定时器每秒钟触发一次,然后启动定时事件,如果它没有运行
if(!timedEvent.Running)timedEvent.f()

评论说如果花费比定时器间隔更长的时间,f()将立即重复.这是一个公平的点我可能会在f()中包含这样的逻辑,以便Running保持原样.所以看起来像这样:

public void f(int t) // t is interval in seconds
{
   this.running = true;

   Stopwatch stopWatch = new Stopwatch();
   stopWatch.Start();

   do
   {
       stopwatch.Reset();

       // Do work here

   } while (stopWatch.Elapsed.Seconds > t); // repeat if f() took longer than t

   this.running = false;   
}

原文地址:https://www.jb51.cc/csharp/94895.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐