【问题标题】:Process.Start takes long time to start outside applicationProcess.Start 需要很长时间才能启动外部应用程序
【发布时间】:2015-06-13 18:29:30
【问题描述】:

我有一个启动第二个 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();
    }

【问题讨论】:

标签: c#


【解决方案1】:

您的场景实际上并不需要单独的线程。您可以通过订阅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(); 
        }
    }

【讨论】:

  • Idle_mind,用你的方法试了,结果一样。是的,当第一个应用程序关闭时,它会启动并关闭第二个应用程序,但是如果我让它在没有断点的情况下运行,它会再次挂起。在“_ProcessMine.EnableRaisingEvents = true;”处设置断点它立即打开。几乎就像我在那里需要某种计时器/空闲。我试过 Thread.Sleep 但这也没有用。感谢您的关注。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2013-11-15
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
相关资源
最近更新 更多