我有一个应用程序,我将显示一个计时器。
用户将执行一个事件,并应在一定时间内完成。 我目前有一个计时器,显示他们的时间滴答,但我现在想要的是总累计时间。因此,每次新事件开始时,完成事件的时间都会添加到其累计时间。然后,当他们正在执行事件时,时间正在累积累计时间。
这就是我对“当前计时器”的看法
u.StartingTime = u.ChangeOverStandard;
u.CurrentChangeOverTime = u.StartingTime - (DateTime.Now - u.ChangeOverStart);
所有这些字段都是时间跨度。这适用于他们的“当前”计时器
但是我需要一个“全部”计时器,它可以显示正的时间跨度值......如果它们在它们应该被完成之前完成...或者如果它们花费太长时间则是负时间跨度值。
编辑:
所以我想实现这个目标:
例如:对于“事件1”,用户有30秒。结束然后用户具有“TotalTimespan”属性= 30.使用事件计时器减少此总数。假设他在24秒内完成比赛。这意味着他在TotalTimespan还有6秒的时间。然后“event2”必须在40秒内完成。所以在event2的开头,TotalTimespan = TotalTimespane(6)+ 40. = 46.如果用户使用60秒,那么TotalTimespan = 46 -60 = -14。
“计时器”不是计时器,不能用作计时器。它正在后台工作器上运行,后者正在进行其他几项计算。所以我不能一次一秒地取消时间。
在每次新活动中,我都试过
u.AccumulatedTime += u.ChangeOverStandard;
然后
u.AccumulatedTime -= u.StartingTime - (DateTime.Now - u.ChangeOverStart);
但显然这不会起作用,因为它是从每一轮累计时间到我的循环所花费的总时间
DateTime.Now - u.ChangeOverStart
^^会给我从事件开始到现在的经过时间,这就是我想要的吗?
u.AccumulatedTime -= DateTime.Now - u.ChangeOverStart;
答案 0 :(得分:0)
您只需要一个 TimeSpan 和两个 DateTime 静态(全局)变量来跟踪时间并进行计算。以下是使用您描述的数字的示例:
TimeSpan left = new TimeSpan(0, 0, 30); //30 seconds allowed for task.
DateTime start = DateTime.UtcNow;
//User perform action.
System.Threading.Thread.Sleep(24000); //24 sec wait.
DateTime stop = DateTime.UtcNow;
left = left - (stop - start);
Console.WriteLine(Math.Ceiling((double)left.TotalSeconds));
//Output was: 6
left = left + new TimeSpan(0, 0, 40); //40 seconds allowed for task.
start = DateTime.UtcNow;
//User perform action.
System.Threading.Thread.Sleep(60000); //60 sec wait.
stop = DateTime.UtcNow;
left = left - (stop - start);
Console.WriteLine(Math.Ceiling((double)left.TotalSeconds));
//Output was: -14
left = left + new TimeSpan(0, 0, 30); //30 seconds allowed for task.
Console.WriteLine(Math.Ceiling((double)left.TotalSeconds));
//Output was: 16
如您所见,如您所料,最后的剩余时间为 16 秒。