簡體   English   中英

Process.Start需要很長時間才能啟動外部應用程序

[英]Process.Start takes long time to start outside application

我有一個啟動第二個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();
    }

您實際上不需要針對您的方案的單獨線程。 您可以通過訂閱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(); 
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM