从指定时间开始秒表

时间:2013-07-16 09:26:41

标签: c# winforms time stopwatch

我试图从给定时间开始秒表(从数据库中提取的十进制值)。但是,因为Stopwatch.Elapsed.Add返回一个新的时间跨度而不是修改秒表,我无法找到最好的前进方式。

var offsetTimeStamp = new System.TimeSpan(0,0,0).Add(TimeSpan.FromSeconds((double)jd.ActualTime));
Stopwatch.Elapsed.Add(offsetTimeStamp);
Stopwatch.Start();

我有什么想法可以做到这一点?干杯

4 个答案:

答案 0 :(得分:5)

普通StopWatch不支持偏移时间跨度的初始化,而TimeSpanstruct,因此Elapsed是不可变的。你可以在StopWatch附近写一​​个包装器:

public class StopWatchWithOffset
{
    private Stopwatch _stopwatch = null;
    TimeSpan _offsetTimeSpan;

    public StopWatchWithOffset(TimeSpan offsetElapsedTimeSpan)
    {
        _offsetTimeSpan = offsetElapsedTimeSpan;
        _stopwatch = new Stopwatch();
    }

    public void Start()
    {
        _stopwatch.Start();
    }

    public void Stop()
    {
        _stopwatch.Stop();
    }

    public TimeSpan ElapsedTimeSpan
    {
        get
        {
            return _stopwatch.Elapsed + _offsetTimeSpan;
        }
        set
        {
            _offsetTimeSpan = value;
        }
    }
}

现在您可以添加一个开始时间段:

var offsetTimeStamp = TimeSpan.FromHours(1);
var watch = new StopWatchWithOffset(offsetTimeStamp);
watch.Start();
System.Threading.Thread.Sleep(300); 
Console.WriteLine(watch.ElapsedTimeSpan);// 01:00:00.2995983

答案 1 :(得分:0)

StopWatch的{​​{3}}属性是只读的,这是有道理的。秒表只测量开始和停止之间经过的时间。

如果要为值添加时间跨度 - 在变量中获取Elapsed值并在测量后添加时间跨度(即停止后)。

答案 2 :(得分:0)

我想你想在Stopwatch指定的一段时间后开始你的TimeSpan。我想知道为什么你不想在Stopwatch指定的时间开始DateTime

public class MyStopwatch : Stopwatch
{
    public void Start(long afterMiliseconds)
    {
        Timer t = new Timer() { Interval = 1 };
        int i = 0;
        t.Tick += (s, e) =>
        {
            if (i++ == afterMiliseconds)
            {
                Start();
                t.Stop();
            }
        };
        t.Start();
    }
}
//use it
var offsetTimeStamp = new System.TimeSpan(0,0,0).Add(TimeSpan.FromSeconds((double)jd.ActualTime));
myStopwatch.Start((long)offsetTimeStamp.TotalMiliseconds);

答案 3 :(得分:0)

如果您将此文件放入项目中 - 您的项目中无需更改任何内容 - 此包装器具有相同的名称,所有方法/参数与原始秒表相同。但还有一些:

  • 额外的SetOffset()方法
  • 使用offset进行额外初始化;

using System;

public class Stopwatch : System.Diagnostics.Stopwatch
{
    TimeSpan _offset = new TimeSpan();

    public Stopwatch()
    {
    }

    public Stopwatch(TimeSpan offset)
    {
        _offset = offset;
    }

    public void SetOffset(TimeSpan offsetElapsedTimeSpan)
    {
        _offset = offsetElapsedTimeSpan;
    }

    public TimeSpan Elapsed
    {
        get{ return base.Elapsed + _offset; }
        set{ _offset = value; }
    }

    public long ElapsedMilliseconds
    {
        get { return base.ElapsedMilliseconds + _offset.Milliseconds; }
    }

    public long ElapsedTicks
    {
        get { return base.ElapsedTicks + _offset.Ticks; }
    }

}