C# 如何使时间流逝的方法?

C# 如何使时间流逝的方法?,c#,runtime,stopwatch,C#,Runtime,Stopwatch,我需要一个方法,让我的过程经过一段时间。我在流程开始时调用它,在流程结束时再次调用它,然后该方法打印所用的总时间 这是我的方法,但总是以00:00打印时间。为什么会发生这种情况 public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions) { var stopwatch = new System.Diagnostics.Stopwatch(

我需要一个方法,让我的过程经过一段时间。我在流程开始时调用它,在流程结束时再次调用它,然后该方法打印所用的总时间

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

        }           
    } 

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

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

使用:

var startTime = DateTime.Now;

... your code

var elapsed = DateTime.Now - startTime;
如何使用:

var startTime = DateTime.Now;

... your code

var elapsed = DateTime.Now - startTime;

您需要使用timeSpan.TotalMinutes,而不是timestamp.Minutes。请参阅文档

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

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


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

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


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

将秒表变量声明置于方法之外。

将秒表变量声明置于方法之外

    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
false
进行比较。直接使用它,如果你想反转它,只需使用

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

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

更好的结构是:

if(time)
{
    stopwatch.Start();
}

... //code to measure here

if (time) 
{
    stopwatch.Stop(); 
    // log elapsed time
}
注:


如果您有一个布尔类型,则不会将其与
true
false
进行比较。直接使用它,如果你想反转它,只需使用
您的
秒表
变量是本地变量。当您第二次调用该函数时,它将再次初始化

您需要将声明上移到类级别

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

public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
{
   ... etc

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

您需要将声明上移到类级别

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

public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
{
   ... etc

DateTime是计算运行时间的工具。@Brad Christie:谢谢你的链接。说得好。在这种情况下,OP似乎只会将经过的时间用于用户信息,因此可能足够精确。但再次感谢您指出这一点。DateTime是计算经过时间的工具。@Brad Christie:谢谢您的链接。说得好。在这种情况下,OP似乎只会将经过的时间用于用户信息,因此可能足够精确。再次感谢你指出这一点。这是什么类型的变量?或者如何在外部写入变量。。。我在想一些类似的问题。看答案。这是什么类型的变量?或者如何在外部写入变量。。。我在想一些类似的问题,看答案。