我试图从给定时间开始秒表(从数据库中提取的十进制值)。但是,因为Stopwatch.Elapsed.Add返回一个新的时间跨度而不是修改秒表,我无法找到最好的前进方式。
var offsetTimeStamp = new System.TimeSpan(0,0,0).Add(TimeSpan.FromSeconds((double)jd.ActualTime));
Stopwatch.Elapsed.Add(offsetTimeStamp);
Stopwatch.Start();
我有什么想法可以做到这一点?干杯
答案 0 :(得分:5)
普通StopWatch
不支持偏移时间跨度的初始化,而TimeSpan
是struct
,因此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)
如果您将此文件放入项目中 - 您的项目中无需更改任何内容 - 此包装器具有相同的名称,所有方法/参数与原始秒表相同。但还有一些:
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; }
}
}