C#检查方法是否执行

时间:2018-02-07 15:37:53

标签: c#

我有一个调用外部exe文件的方法。

 private void MainTask()
    {
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        startInfo.FileName = "test.exe";
        process.StartInfo = startInfo;
        process.Start();
    }

运行test.exe文件可能需要10-50-150秒。问题是如何检查它的执行位置或仍在运行。

我试图像这样实现backgroundWorker:

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        MainTask();
    }


    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

        pictureBoxOutput.Image = 
        MessageBox.Show("C Sharp is awesome.");
    }

是否可以检查方法何时完全执行?因为现在我收到一条消息“C Sharp很棒。”即使进程仍在运行。

编辑:我想创建一个进度条,我需要在流程完成后更新表单上的几个元素。进程创建新文件,我需要显示新文件的名称。当然它应该先完成,否则应用程序将崩溃

3 个答案:

答案 0 :(得分:0)

您需要致电process.WaitForExit()

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
 startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
 startInfo.FileName = "test.exe";
 process.StartInfo = startInfo;
 process.Start();
 process.WaitForExit(); // this will block while the process is running

答案 1 :(得分:0)

这一切都归结为在程序完成后有一个回调函数。有两种方法:

  1. 注册流程类Exited Event

  2. 如果你想保留当前的BackgroundWorker代码,你必须在BackgroundWorker中添加一个“等待进程完成你继续”的调用,正如Mihail Shishkov在他的回答中所示。

    < / LI>

    Process.Start()不会等待进程退出。它会立即继续。有效使用Process.Start()与点击Windows运行对话框上的“确定”按钮相同。无论程序从那时开始做什么,您的代码都会立即继续。在大多数情况下,您甚至可以在调用start后立即使用对流程实例的引用超出范围。

答案 2 :(得分:0)

您可以使用Exited event

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "test.exe";
process.StartInfo = startInfo;
process.Exited += (sender, e) => {
    pictureBoxOutput.Image = ...;
    MessageBox.Show("C Sharp is awesome.");

};
process.Start();