2015-06-13 159 views
0

我有一個啓動第二個exe的方法。我遇到的問題是,如果我在Visual Studio中處於調試模式,並且在Process.Start調用後直接放置斷點,我的第二個應用程序立即啓動,但如果我在VS中沒有斷點或運行我的主C#應用程序在VS之外,通過Process.Start啓動我的第二個應用程序最多可能需要兩分鐘的時間。我的方法是在下面,我把我的斷點看到第二個應用程序的立即啓動是在「if(null!= _ProcessMine)」行。我把第二個exe文件的啓動放在了一個工作線程中,因爲當我關閉主exe文件時,我想要關閉第二個exe文件。Process.Start需要很長時間才能啓動外部應用程序

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(); 
    } 
+0

我已經編輯好標題:

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); } } 

你可以使用類似關閉它。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

實際上您並不需要針對您的方案使用單獨的線程。您可以通過訂閱Process.Exited()事件完成同樣的事情:

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

Idle_mind,試試你的方式相同的結果。是的,它會在第一個應用程序關閉時啓動並關閉第二個應用程序,但如果我讓它在沒有中斷點的情況下運行,則會掛起。在「_ProcessMine.EnableRaisingEvents = true;」處放置一個斷點並立即打開。它幾乎就像我需要某種計時器/閒置那裏。我嘗試過Thread.Sleep,但那也不起作用。感謝您的關注。 – 67vette427

相關問題