C# 如何使用System.Threading.Timer c在同一线程上运行代码#
我有一个应用程序,它应该每隔几秒钟运行一个方法,但要等到上一次运行完成。我通过在metod运行之前禁用计时器解决了这个问题,如下代码所示。我有一些怀疑,另一个线程被调用时,无论如何。我想在同一个线程上运行所有内容。关于如何使用system.threading.timer实现这一点,有什么想法吗 提前谢谢C# 如何使用System.Threading.Timer c在同一线程上运行代码#,c#,multithreading,timer,C#,Multithreading,Timer,我有一个应用程序,它应该每隔几秒钟运行一个方法,但要等到上一次运行完成。我通过在metod运行之前禁用计时器解决了这个问题,如下代码所示。我有一些怀疑,另一个线程被调用时,无论如何。我想在同一个线程上运行所有内容。关于如何使用system.threading.timer实现这一点,有什么想法吗 提前谢谢 timer = new System.Threading.Timer((e) => { Console.WriteLine("*** Running Code *** "
timer = new System.Threading.Timer((e) =>
{
Console.WriteLine("*** Running Code *** ");
Console.WriteLine(DateTime.Now);
timer.Change(Timeout.Infinite, Timeout.Infinite);
MyMethod();
timer.Change(periodTimeSpanGet,periodTimeSpanGet);
Console.WriteLine("*** Code Finished Code *** ");
Console.WriteLine(DateTime.Now);
}
, null, startTimeSpan, periodTimeSpanGet);
`为什么不运行异步循环呢
while(someCondition)
{
DoTheWork();
await Task.Delay(someAmountOfTime);
}
如果计时很重要,您可以运行来测量时间的流逝,并进行一些计算,以确定
someAmountOfTime
应该是什么。否则,只需使用常量值。您需要使用共享信号量将方法的并发执行限制为每次1。在启动计时器之前实例化一次信号量,并在计时器的每次执行中重用它
当方法启动时,您需要等待信号量变为可用。在方法的末尾,您需要释放信号量。这确保在等待和释放之间一次只发生一次执行
使用信号灯比使用锁更好,因为它允许您提供超时,即放弃前的最长等待时间
为什么“在同一条线上”?这有什么好处?计时器回调发生在线程池中,因此不一定在同一线程上。请使用
SynchronizationContext
Post或Send(假设您尝试封送到的线程不是线程池并支持此功能),您的问题似乎是不需要的并发(执行重叠),并不是说每次执行都可能发生在不同的线程中。第二个问题的解决方案也是第一个问题的解决方案,但可能不是最优方案。谢谢。如何解决不需要的并发?您可以通过等待或使用初始化计数为1的实例化的WaitAsync
方法轻松解决不需要的并发问题。你的问题已经很好地回答了你想要的,但不是你在标题中提出的问题!此解决方案不能保证执行之间的间隔恒定。要使其保持不变(假设每个作业持续的时间少于延迟),您应该创建任务。在执行作业之前延迟任务,然后等待任务。@Theodorzouli也是,但OPs现有解决方案在作业之间使用了固定的间隔,因此这大致相同。不过,我喜欢在上班前推迟一段时间的想法。很好。@你说得对。您的解决方案与OP的当前设置相匹配。不过,我相信他们更喜欢固定的时间间隔。:-)