单独线程上的可暂停计时器

Posted

技术标签:

【中文标题】单独线程上的可暂停计时器【英文标题】:Pausable Timer on separate thread 【发布时间】:2019-07-28 01:50:27 【问题描述】:

我需要在可以暂停和恢复的单独线程上运行计时器。 System.Threading.Timer 没问题。但我注意到即使在调试回调时它也会产生新线程。我不想在第一个回调完成之前开始下一个回调,我想在回调执行期间暂停计时器。

System.Threading.Timer 无法暂停。 我不会测量任何时间,所以没有System.Diagnostics.Stopwatch。 在this qestion 中,有人实现了他自己的源自Timer 的类,但我不知道这是什么计时器——System.Threading.Timer 是密封的。 System.Windows.Threading.DispatcherTimer 可以停止,但回调是在 UI 线程上调度的,我不确定这个类的可移植性。

我该怎么办?

【问题讨论】:

你可以让一个任务进入一个循环,中间有一个延迟,然后让它运行。 是的,我现在只是在写一个带有 while 循环的线程,但我想可能已经提供了一些内置方式。 你可以使用一个普通的计时器,但你正在做的事情是Task,然后每次运行你都会检查上一个任务是否完成或类似的事情。 【参考方案1】:

你可以不使用计时器,而是让它成为一个有延迟的循环:

public static async Task RepeatingTask()

    while(true)
    
        Console.WriteLine( "Doing cool stuff" );
        await Task.Delay( 2000 );
    

你可以这样开始:

Task.Run( RepeatingTask );

注意:如果您需要精确地每隔 2 秒触发一次,这将无法解决问题。

【讨论】:

以上是关于单独线程上的可暂停计时器的主要内容,如果未能解决你的问题,请参考以下文章

C# 计时器是不是在单独的线程上运行?

具有长时间运行任务的单独线程中的计时器

当活动不在前面时,在Android中暂停CountDownTimer

如何从 Sharepoint 2010 沙盒中的单独线程访问 SPSite 对象

用java编一个简单的倒计时表

捕获空格键按下以暂停Timer C#