0

我需要一种方法,让我的过程花费一段时间。我在启动过程时调用它,并在完成过程时再次调用它,该方法打印总时间。

这是我的方法,但总是在 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);

        }           
    } 
4

7 回答 7

2

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

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

于 2011-05-05T15:56:54.700 回答
1

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

于 2011-05-05T15:56:45.023 回答
1

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

于 2011-05-05T15:57:01.100 回答
1

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

您需要将声明提升到类级别。

System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();

public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
{
   ... etc
于 2011-05-05T15:58:46.243 回答
0

如何使用:

var startTime = DateTime.Now;

... your code

var elapsed = DateTime.Now - startTime;
于 2011-05-05T15:56:46.347 回答
0
    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
}

笔记:

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

于 2011-05-05T15:57:30.290 回答
-1

您需要使用 timeSpan.TotalMinutes 而不是 timestamp.Minutes。参考时间跨度文档

于 2011-05-05T15:56:48.170 回答