gpt4 book ai didi

c# - 计时器线程是等到回调函数中的所有步骤都完成还是回调函数在每个周期都被重新调用

转载 作者:行者123 更新时间:2023-11-30 20:01:50 24 4
gpt4 key购买 nike

我有一个定时器线程函数

SampleTimer = new Timer(SomeTask,0,70000)

回调函数如下

void SomeTask(object o)
{
//block using autoresetevent
}

问题是 SomeTask() 回调方法每 70 秒被调用一次,即使回调方法中的所有操作仍未完成。我怎样才能防止计时器在完成其中的所有步骤之前调用 SomeTask() 函数

最佳答案

我假设您正在使用 System.Threading.Timer

一种方法是一次性创建计时器,然后在线程完成其任务后重新启动它。这样你就可以确定你不会有任何重叠:

myTimer = new Timer(someMethod, null, 70000, Timeout.Infinite);

在你的回调中:

void TimerCallback(object o)
{
// do stuff here
// then change the timer
myTimer.Change(70000, Timeout.Infinite);
}

为周期指定 Timeout.Infinite 会禁用周期性信号,将计时器变成一次性计时器。

另一种方法是使用监视器:

object TimerLock = new object();

void TimerCallback(object o)
{
if (!Monitor.TryEnter(TimerLock))
{
// already in timer. Exit.
return;
}

// do stuff

// then release the lock
Monitor.Exit(TimerLock);
}

如果您想知道为什么我不使用 try/finally 作为锁,请参阅 Eric Lippert 的博客,Locks and exceptions do not mix .

这两种方法的主要区别在于,在第一种方法中,计时器将在前一个回调执行完成后 70 秒触发。在第二秒中,计时器将在 70 秒的时间段内触发,因此下一个回调可能会在前一个回调完成后的任何时间执行,从一秒后到 70 秒后。

对于我做过的大多数事情,我展示的第一种技术似乎效果更好。

关于c# - 计时器线程是等到回调函数中的所有步骤都完成还是回调函数在每个周期都被重新调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17996147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com