秒表时间流逝零
本文关键字:流逝 时间 | 更新日期: 2023-09-27 18:05:58
我在mvc中有两个动作,在一个我开始一个全局秒表,在另一个我停止它,但时间流逝总是0无论时间流逝的时间有多长。这两个事件都是由单击按钮触发的。我的怀疑是,按钮的帖子是搞乱了我的时间流逝也许?如果是这样,有什么解决办法吗?
public Stopwatch stopwatch = new Stopwatch();
public ActionResult Start()
{
stopwatch.Start();
return RedirectToAction("Index");
}
public ActionResult Stop(int workid)
{
stopwatch.Stop();
TimeSpan ts = stopwatch.Elapsed;
int hours = ts.Hours;
int mins = ts.Minutes;
using (ZDevContext db = new ZDevContext())
{
DashboardHelper dashhelper = new DashboardHelper(db);
dashhelper.RecordTimeSpent(workid, hours, mins);
}
return View("Index");
}
这不是同一个StopWatch -每个请求都会重新创建控制器。你需要把秒表放在某个地方。
您可以在static Dictionary<int,DateTimeOffset>
中持久化开始时间,从而将workId
映射到开始时间。
static ConcurrentDictionary<int,DateTimeOffset> starts = new ConcurrentDictionary<int,DateTimeOffset>();
public ActionResult Start(int workId)
{
starts.TryAdd(workId, DateTimeOffset.Now);
return RedirectToAction("Index");
}
public ActionResult Stop(int workId)
{
DateTimeOffset started = DateTimeOffset.MinValue;
if (starts.TryGet(workId, out started))
{
// calculate time difference
}
return View("Index");
}
但这仍然不是很好,因为您的应用程序可能会被IIS重新启动,并且您将失去start值。当不再需要某个值时,它也没有清理表的代码。你可以通过使用。net缓存来改进后者,但你确实需要一个数据库来做这件事。
如果您想让相同的实例为所有会话共享(这通常是您不希望的),只需将其标记为静态,
private static Stopwatch stopwatch = new Stopwatch();
同样,如果它不能从其他控制器/程序集访问,你也不必将其定义为public。
正如@Ian Mercer建议的那样,这不是一个很好的秒表使用方式。
看看这些链接:
访问修饰符静态c#