c# - System.Timers.Timer 如何获取 Elapse 之前的剩余时间

标签 c# timer windows-services elapsedtime system.timers.timer

使用 C#,如何从 System.Timers.Timer 对象中获取剩余时间(在 elapse 事件发生之前)?

换句话说,假设我将计时器间隔设置为 6 小时,但 3 小时后,我想知道还剩多少时间。我如何让计时器对象显示剩余时间?

最佳答案

内置计时器不提供剩余时间直到结束。您需要创建自己的类来包装计时器并公开此信息。

这样的事情应该可行。

public class TimerPlus : IDisposable
{
    private readonly TimerCallback _realCallback;
    private readonly Timer _timer;
    private TimeSpan _period;
    private DateTime _next;

    public TimerPlus(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period)
    {
        _timer = new Timer(Callback, state, dueTime, period);
        _realCallback = callback;
        _period = period;
        _next = DateTime.Now.Add(dueTime);
    }

    private void Callback(object state)
    {
        _next = DateTime.Now.Add(_period);
        _realCallback(state);
    }

    public TimeSpan Period => _period;
    public DateTime Next => _next;
    public TimeSpan DueTime => _next - DateTime.Now;

    public bool Change(TimeSpan dueTime, TimeSpan period)
    {
        _period = period;
        _next = DateTime.Now.Add(dueTime);
        return _timer.Change(dueTime, period);
    }

    public void Dispose() => _timer.Dispose();
}

关于c# - System.Timers.Timer 如何获取 Elapse 之前的剩余时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278525/

相关文章:

javascript - 如何为html中的多个元素设置相同的id

java - 在java中调度可运行的任务

c# - Windows服务在Docker容器中启动后立即关闭

javascript - 将 C# 字符串转换为 JavaScript 字符串

c# - 如何将对象数组作为单独的参数传递给方法?

c# - 使用 WCF,REST 和 SOAP 肯定应该协调工作吗?

java - 两个不同 JPanel 上的 PaintComponent 坐标

windows - 当由 Windows 服务生成的进程调用时,CreateMutex() 失败并显示 ERROR_ACCESS_DENIED

.net - 正确使用应用程序配置文件中的 <system.diagnostics> 设置

c# - 静态方法是否共享其局部变量以及在不同线程并发使用期间会发生什么?