我需要一种方法,让我花费一些时间来完成我的过程。我在启动过程中调用它并在完成该过程时再次调用它,该方法将打印已用完的总时间。
这是我的方法,但始终在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);
}
}
答案 0 :(得分:2)
看看你宣布stopwatch
的地方;这是一个局部变量。这意味着您正在创建和使用两种不同的秒表;第一个是在使用“true”参数调用方法时启动,然后在方法结束且变量超出范围时处理掉。第二个是声明的,从未开始,然后检查并记录它的时间。
要解决此问题,请为秒表声明一个实例变量(“field”)。只要对象在周围,这将保持在范围内,这意味着它将在方法结束后继续运行,并且当您返回到它以停止并检查它时仍将是相同的实例。
答案 1 :(得分:1)
每次调用此方法时,您都会创建一个新的秒表,但看起来应该在方法调用之间保持不变。
答案 2 :(得分:1)
在方法之外采取秒表变量声明。
答案 3 :(得分:1)
您的stopwatch
变量是本地变量。当您第二次调用该函数时,它会再次初始化。
您需要将声明升级到班级。
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
{
... etc
答案 4 :(得分:0)
如何使用:
var startTime = DateTime.Now;
... your code
var elapsed = DateTime.Now - startTime;
答案 5 :(得分: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
或false
进行比较。只需直接使用它,如果你想反转它,只需使用!
。
答案 6 :(得分:-1)
您需要使用timeSpan.TotalMinutes而不是timestamp.Minutes。请参阅timespan文档