获取时间过程需要几秒钟完成?

时间:2013-05-16 19:37:20

标签: c# winforms timer messagebox

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

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

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

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

如何在几秒钟内完成准确的完成时间?

6 个答案:

答案 0 :(得分:14)

Stopwatch watch = new Stopwatch();
watch.Start();
//Do things
watch.Stop();
Text = watch.Elapsed.TotalSeconds.ToString();

答案 1 :(得分:1)

基本Stopwatch就足够了。

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秒,因为它实际上没什么用。

答案 2 :(得分:1)

您是否尝试过process.ExitTime.Subtract(process.StartTime).TotalSeconds

编辑添加:请注意,如果您尝试在流程退出之前使用此功能,则会收到异常。根据{{​​1}}的{​​{3}},如果您对是否是这种情况有任何疑问,请使用ExitTime属性。

答案 3 :(得分:1)

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

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

要访问您可能想要更改两个`var局部变量,以便从本地范围外部访问。

下面是如何在Class

顶部的本地方法之外声明它
   public static TimeSpan procTime = new TimeSpan();
   var procTimeInSec, can still be declared in the local scope

答案 4 :(得分:0)

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

答案 5 :(得分:0)

开始此过程时应使用秒表类。

在此过程中,为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();
   }
}