如何制作带超时功能的定时器

发布于 2024-11-29 07:13:00 字数 366 浏览 0 评论 0原文

我有一个缓慢的方法,同时在计时器(System.Timers.Timer)上执行它。有时执行时间会比计时器的超时时间长,这会导致计时器等待。我想当我将计时器设置为 30 毫秒时,例如,30 毫秒后,重置该方法,而不是等待。我应该使用什么样的计时器?

编辑:

void OnTimerElapsed() {
      SomeMethod(args1);
      SomeMethod(args2);
      SomeMethod(args3);
}

SomeMethod 位于另一个程序集中。这是一种从另一个应用程序请求数据的同步方法。我不知道为什么它有时会挂起。这会导致计时器暂停,直到 SomeMethod() 继续。

I have a slow method, while executing it on timer (System.Timers.Timer). It sometimes gets longer to execute than the timer's timeout, which causes the timer to wait. I want while I set the timer for 30ms for example, after 30ms, to reset the method, not wait. What kind of timer should I use?

EDIT:

void OnTimerElapsed() {
      SomeMethod(args1);
      SomeMethod(args2);
      SomeMethod(args3);
}

SomeMethod is located in another assembly. It's a sync method which requests data from another application. I don't know why it sometimes hangs. That causes the timer to pause until SomeMethod() continues.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伏妖词 2024-12-06 07:13:00

使用 System.Timers.Timer 并将其 AutoReset 设置为 false,并且仅在前一个时间结束或在您的自定义条件下启动它。这是我使用的模式:

private System.Timers.Timer _timer = new System.Timers.Timer();
private volatile bool _requestStop = false;

private void InitializeTimer()
{
    _timer.Interval = 100;
    _timer.Elapced += OnTimerElapced;
    _timer.AutoReset = false;
    _timer.Start();
}

private void OnTimerElapced(object sender, System.Timers.TimerEventArgs e)
{
    //_timer.Stop();//if AutoReset was not false

    //do work....

    if (!_requestStop)
    {
        _timer.Start();//restart the timer
    }
}

private void Stop()
{
    _requestStop = true;
    _timer.Stop();
}

private void Start()
{
    _requestStop = false;
    _timer.Start();
}

编辑:如果您喜欢观看计时器并且操作需要较长时间,那么您不应该首先使用计时器,而是使用将您的操作包装在一个新线程中并使用MaunalResetEvent,使用其WaitOne方法来指定超时,如果发生超时则停止或停止该操作。

Use the System.Timers.Timer and set the its AutoReset to false, and only start it when the previous elapsed finished or at your custom condition. Here is the pattern that I use:

private System.Timers.Timer _timer = new System.Timers.Timer();
private volatile bool _requestStop = false;

private void InitializeTimer()
{
    _timer.Interval = 100;
    _timer.Elapced += OnTimerElapced;
    _timer.AutoReset = false;
    _timer.Start();
}

private void OnTimerElapced(object sender, System.Timers.TimerEventArgs e)
{
    //_timer.Stop();//if AutoReset was not false

    //do work....

    if (!_requestStop)
    {
        _timer.Start();//restart the timer
    }
}

private void Stop()
{
    _requestStop = true;
    _timer.Stop();
}

private void Start()
{
    _requestStop = false;
    _timer.Start();
}

Edit: If you like to watch the timer and if the operation takes longer time then you should not use timer in the first place, instead use wrap your operation in a new thread and use MaunalResetEvent, use its WaitOne method to specify the timeout, if the timeout occurs then stop or about the operation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文