Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用System.Threading.Timer c在同一线程上运行代码#_C#_Multithreading_Timer - Fatal编程技术网

C# 如何使用System.Threading.Timer c在同一线程上运行代码#

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 *** "

我有一个应用程序,它应该每隔几秒钟运行一个方法,但要等到上一次运行完成。我通过在metod运行之前禁用计时器解决了这个问题,如下代码所示。我有一些怀疑,另一个线程被调用时,无论如何。我想在同一个线程上运行所有内容。关于如何使用system.threading.timer实现这一点,有什么想法吗

提前谢谢

  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的当前设置相匹配。不过,我相信他们更喜欢固定的时间间隔。:-)