每次评估错误时增加计时器

时间:2017-03-17 14:05:34

标签: c# timer

我测量Internet Explorer中某些操作的时间。我测量的其中一个动作是通过IE中的链接启动另一个应用程序。要测量此应用程序启动所需的时间,我在IE中单击链接后启动计时器,并且我已计划在应用程序完全加载后停止它。问题是我的应用程序将执行下一行,因为评估总是错误的,因为外部应用程序加载的行之间没有足够的时间。

try
{
    Process[] externApp = Process.GetProcessesByName("External");
    System.Timers.Timer runningWindow = new System.Timers.Timer(1000);
    runningWindow.Start();
    while (runningWindow.Enabled)
    {
        if (externApp[0].Responding)
        {
            timer.Stop();
            output[2] = timer.Elapsed.Seconds.ToString();
            runningWindow.Stop();
        }
        runningWindow.Interval += 100;
    }
    externApp[0].Kill();
}
catch (Exception e)
{
    MessageBox.Show(e.Message);
}

以上是我在等待其他应用程序响应时,我目前正试图让我的应用程序挂起的方式。

由于我不确定如何等待另一个应用程序加载我决定在检查其他应用程序是否正在运行后使用计时器推迟执行下一行。如果应用程序没有运行,我会将计时器增加十分之一秒,然后再次检查。然而,我遇到的问题是,我不认为我增加了计时器,因为此步骤的时间测量总是为0。

那么如果外部应用程序没有响应,我如何增加计时器?

2 个答案:

答案 0 :(得分:1)

虽然上面在评论中解释的原因仍然不可靠,但您仍然可以使用Process.WaitForInputIdle来近似评估应用所需的启动时间

// Launch the external app...
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"D:\temp\MyExternalApp.exe";
psi.WorkingDirectory = @"D:\temp";

// Init measure
Stopwatch sw = StopWatch.StartNew();
Process.Start(psi);
Process[] externApp = null;
int cnt = 0;
bool ready = false;
while (externApp == null || externApp.Length == 0 || cnt == 600)
{
    // Loop until the process appears in the process list.
    // This is taxing for the performances. Heisenberg here
    externApp = Process.GetProcessesByName("MyExternalApp");
    Thread.Sleep(100);
    cnt++;
}
if(cnt >= 600) 
    MessageBox.Show("Something has gone terribly wrong launching the external app");
else
    ready = externApp[0].WaitForInputIdle(30000);

sw.Stop();

if(!ready)
    MessageBox.Show("Not ready after:" + sw.ElapsedMilliseconds + " ms"); 
else
    MessageBox.Show("Ready after:" + sw.ElapsedMilliseconds + " ms"); 

如果您无法启动外部进程启动的确切时刻,可以使用另一个approch(仍然使用WaitForInputIdle)(就像您关于通过浏览器启动ExternalApp的评论一样)在这种情况下我们可以尝试使用Process类

中的相同命名属性来获取开始时间
Process[] externApp = null;
int cnt = 0;
bool ready = false;
while (externApp == null || externApp.Length == 0 || cnt == 600)
{
    // Again we are waiting to see the process in the list of processes
    externApp = Process.GetProcessesByName("MyExternalApp");
    Thread.Sleep(100);
    cnt++;
}
if(cnt >= 600) 
    MessageBox.Show("Something has gone terribly wrong launching the external app");
else
{
    ready = externApp[0].WaitForInputIdle(30000);
    DateTime readyAt = DateTime.Now;
    TimeSpan ts = readyAt - externApp[0].StartTime;
    MessageBox.Show("Ready after:" + ts.TotalMilliseconds + " ms"); 
}

答案 1 :(得分:0)

您可以在启动IE之前获取当前时间:

 DateTime start = DateTime.Now;

最后从完成时间中减去它,如:

double SecondsElapsed = (DateTime.Now-start).TotalSeconds;