【发布时间】:2020-06-23 20:49:05
【问题描述】:
我有一个应用程序,它应该每隔几秒钟运行一个方法,但要等到上一次运行完成。我已经通过在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);
`
【问题讨论】:
-
为什么“在同一个线程上”?这会带来什么好处?定时器回调发生在线程池中,所以不一定在同一个线程上。
-
使用
SynchronizationContextPost 或 Send(假设你试图编组的线程不是线程池并且支持这个) -
看来您的问题是不需要的并发性(重叠执行),而不是每次执行都可能发生在不同的线程中。第二个问题的解决方案也是第一个问题的解决方案,但可能不是最佳解决方案。
-
谢谢。如何解决不需要的并发?
-
您可以通过等待
Task.Delay或SemaphoreSlim的WaitAsync方法以初始计数= 1 实例化,轻松解决不必要的并发问题。您的问题已经有了很好的答案你想要的,但不是你在标题中要求的!
标签: c# multithreading timer