Process.Start需要很长时间才能启动外部应用程序

时间:2015-06-13 18:29:30

标签: c#

我有一个启动第二个exe的方法。我遇到的问题是,如果我在Visual Studio中处于调试模式,并且在Process.Start调用之后直接放置断点,我的第二个应用程序会立即启动,但如果我在VS中没有断点或运行我的主要C#应用程序在VS之外,通过Process.Start启动我的第二个应用程序最多可能需要两分钟。我的方法是在下面,我把我的断点看到立即启动第二个应用程序是在行“if(null!= _ProcessMine)”。我把第二个exe的启动放在一个工作线程中,因为当我关闭我的主exe时我也希望第二个exe关闭。

    public static void RunBtnProcessThread(string processName, String sArgs, Button btn)
    {
        // disable the button until we release the newly launched process
        btn.Enabled = false;

        BackgroundWorker worker = new BackgroundWorker();

        worker.DoWork += (doWorkSender, doWorkArgs) =>
        {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.CreateNoWindow = false;
            startInfo.UseShellExecute = false;
            startInfo.FileName = processName;
            startInfo.Arguments = sArgs;
            try
            {   
                using ( _ProcessMine = Process.Start(startInfo))
                {
                    if(null != _ProcessMine)
                        _ProcessMine.WaitForExit();
                }
            }
            catch (Exception ex)
            {
                string _Funk = ReflectionHelper.GetMethodFullName(MethodBase.GetCurrentMethod());

                // error
                Debug.Assert(false, "Error: " + ex.Message);

                // Log error.
                TraceUtil.LogException(_Funk, ex);
            }

            System.Threading.Thread.Sleep(500);
        };

        worker.RunWorkerCompleted += (completedSender, completedArgs) =>
        {
            btn.Enabled = true;

            _ProcessMine)= null;
        };            

        worker.RunWorkerAsync();
    }

1 个答案:

答案 0 :(得分:0)

您实际上并不需要为您的方案创建单独的线程。您可以通过订阅Process.Exited()事件来完成同样的事情:

    public static void RunBtnProcessThread(string processName, String sArgs, Button btn)
    {
        // disable the button until we release the newly launched process
        btn.Enabled = false;

        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.CreateNoWindow = false;
        startInfo.UseShellExecute = false;
        startInfo.FileName = processName;
        startInfo.Arguments = sArgs;

        try
        {
            _ProcessMine = Process.Start(startInfo);
            _ProcessMine.EnableRaisingEvents = true;
            _ProcessMine.Exited += (sender, e) =>
            {
                btn.Invoke((MethodInvoker)delegate { 
                    btn.Enabled = true; 
                });
                _ProcessMine = null;
            };
        }
        catch (Exception ex)
        {
            string _Funk = ReflectionHelper.GetMethodFullName(MethodBase.GetCurrentMethod());

            // error
            Debug.Assert(false, "Error: " + ex.Message);

            // Log error.
            TraceUtil.LogException(_Funk, ex);
        }
    }

您可以使用以下内容关闭它:

    void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (_ProcessMine != null && !_ProcessMine.HasExited)
        {
            // Depending on the type of app:
            _ProcessMine.CloseMainWindow();
            // ... or ...
            _ProcessMine.Kill(); 
        }
    }