【问题标题】:How make time elapsed method?如何制作时间流逝的方法?
【发布时间】:2011-05-05 15:52:36
【问题描述】:

我需要一种方法,让我在我的过程中流逝一段时间。我在启动进程时调用它,在进程结束时再次调用它,该方法会打印经过的总时间。

这是我的方法,但总是以 00:00 打印时间。为什么会这样??

public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
    {
        var stopwatch = new System.Diagnostics.Stopwatch();

        LogBinaryWriter BinaryWriter = new LogBinaryWriter();
        string timeElapsed = "";
        if(time == true)
        {
            stopwatch.Start();
        }
        if (time == false) 
        {
            stopwatch.Stop(); 
            TimeSpan timeSpan = stopwatch.Elapsed;
            timeElapsed = (string.Format("\nFile Generated: {0}\nTime Elapsed: {1} minute(s) {2} second(s)",
            BinaryWriter.CreateLogFileName(filePath, Convert.ToInt32(logSelected)),
            timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds / 10 + "\n"));
            userOptions.DisplayUserMessage(timeElapsed);

        }           
    } 

【问题讨论】:

    标签: c# runtime stopwatch


    【解决方案1】:

    看看你在哪里声明stopwatch;它是一个局部变量。这意味着您正在创建和使用两个不同的秒表;第一个在您使用“true”参数调用方法时启动,然后在方法结束并且变量超出范围时处理。第二个被声明,从未开始,然后检查并记录它的时间。

    要解决此问题,请为秒表声明一个实例变量(“字段”)。只要对象在附近,它就会保持在范围内,这意味着它会在方法结束后继续运行,并且在您返回它停止并检查它时仍然是同一个实例。

    【讨论】:

      【解决方案2】:

      您的 stopwatch 变量是本地变量。当您第二次调用该函数时,它会再次初始化。

      您需要将声明移至类级别。

      System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
      
      public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
      {
         ... etc
      

      【讨论】:

        【解决方案3】:

        每次调用此方法时,您都会创建一个新的秒表,但看起来应该在方法调用之间保持不变。

        【讨论】:

          【解决方案4】:

          在方法之外声明秒表变量。

          【讨论】:

          • 这是什么类型的变量?或者我怎样才能在外面写变量? ...我在想一些类似的..
          • @Blorgbeard 回答。
          【解决方案5】:

          如何使用:

          var startTime = DateTime.Now;
          
          ... your code
          
          var elapsed = DateTime.Now - startTime;
          

          【讨论】:

          • DateTime 是计算经过时间的not a good method
          • @Brad Christie:感谢您的链接。好点子。在这种情况下,OP 似乎只会将经过的时间用于用户信息,因此它可能足够精确。但再次感谢您指出这一点。
          【解决方案6】:
              if(time == true)
              {
                  stopwatch.Start();
              }
              if (time == false) 
              {
                  stopwatch.Stop(); 
                  ...
              }
          

          如果time 为真,则您只能启动秒表。

          如果它是假的,你永远不会启动它。

          更好的结构是:

          if(time)
          {
              stopwatch.Start();
          }
          
          ... //code to measure here
          
          if (time) 
          {
              stopwatch.Stop(); 
              // log elapsed time
          }
          

          注意:

          如果您有布尔类型,则不要将其与truefalse 进行比较。直接使用它,如果你想反转它,只需使用!

          【讨论】:

            【解决方案7】:

            您需要使用 timeSpan.TotalMinutes 而不是 timestamp.Minutes。参考timespan文档

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-04-24
              • 2022-01-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-08-13
              • 1970-01-01
              • 2023-03-10
              相关资源
              最近更新 更多