7

我的程序在 cmd.exe 中运行一个批处理文件,完成后我想向用户显示一个 MessageBox 说Finished in #.## seconds

我正在使用 将 CMD 输出重定向到文本框process.BeginOutputReadLine(),这是我尝试过的代码:

if (e.Data == null)
{  
    string time = process.TotalProcessorTime.Seconds.ToString();
    MessageBox.Show("Finished in " + time + " seconds");
}

完成该过程大约需要 7-15 秒,但 MessageBox 显示Finished in 0 seconds

如何以秒为单位获得完成所需的准确时间?

4

6 回答 6

23
Stopwatch watch = new Stopwatch();
watch.Start();
//Do things
watch.Stop();
Text = watch.Elapsed.TotalSeconds.ToString();
于 2013-05-16T19:44:10.153 回答
2

如果它能让你更容易阅读,你最终能做这样的事情吗

var procTime = DateTime.Now - Process.GetCurrentProcess().StartTime;
var procTimeInSec = procTime.Seconds;
MessageBox.Show(string.Format("Finished in {0} seconds", procTimeInSec));

要访问,您可能需要将两个 `var 局部变量更改为可从本地范围之外访问。

下面是如何在类顶部的本地方法之外声明它

   public static TimeSpan procTime = new TimeSpan();
   var procTimeInSec, can still be declared in the local scope
于 2013-05-16T20:08:33.237 回答
2

你试过process.ExitTime.Subtract(process.StartTime).TotalSeconds吗?

编辑添加:请注意,如果您在进程退出之前尝试使用它,您将收到异常。根据的文档,如果您对是否是这种情况有任何疑问,请ExitTime使用该属性。HasExited

于 2013-05-16T19:43:23.527 回答
1

只需基本的秒表就足够了。

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

// run external process, if asynchronous - 
//store stopWatch in member variable instead of local

stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;

请注意,TotalProcessorTime测量 CPU 使用时间,对于 CMD.exe,它很可能是 0 秒,因为它实际上并没有做太多。

于 2013-05-16T19:42:28.297 回答
0

您应该在启动进程时使用 Stopwatch 类。

在流程上,为 Exited 事件添加一个事件处理程序,当流程完成时,停止秒表并检索时间。

class Foo
{
   Stopwatch watch = new Stopwatch();

   public void RunProcess(Process process)
   {
      process.Exited += new EventHandler(ProcessExit);

      process.Start();
      watch.Start();
   }

   public void ProcessExit(object sender, EventArgs e)
   {
      watch.Stop();
   }
}
于 2013-05-16T19:43:53.527 回答
0

您应该查看Stopwatch类。您需要在进程开始之前启动秒表,然后停止它并获取经过的时间。

于 2013-05-16T19:41:39.800 回答