我的程序在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
。
如何在几秒钟内完成准确的完成时间?
答案 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();
}
}