秒表时间流逝零

本文关键字:流逝 时间 | 更新日期: 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#