2013-01-23 54 views
-1

我已經在C#中編寫了一個小程序,它將集成到巡航控件中(編輯:oops,按回車鍵太早),創建特定的(並且不是預定義的)JVM在他們自己的獨立線程中。但是,在殺死線程時,JVM仍然存在並且未被卸載。該功能可以正確處理.bat文件 - 但是如果它們調用JVM,它仍然保持打開狀態!當線程死掉時,包含JVM的線程不會終止JVM

每個線程從這個類的一個實例創建並調用運行()

_Critical用於通過用於測試的原因主處理。

class BatThread 
{ 
    private string _args, _fileName; 
    private bool _critical; 
    public ManualResetEvent Flag; 

    public BatThread(string fileName, string args, bool critical) 
    { 
     _fileName = fileName; 
     _args = args; 
     _critical = critical; 
     Flag = new ManualResetEvent(false); 
    } 
    public void Run() 
    { 
     using (Process Proc = new Process()) 
     { 
      Proc.StartInfo.FileName = _fileName; 
      Proc.StartInfo.Arguments = _args; 
      Proc.StartInfo.RedirectStandardError = false; 
      Proc.StartInfo.RedirectStandardInput = false; 
      Proc.StartInfo.RedirectStandardOutput = false; 
      Proc.StartInfo.UseShellExecute = true; 
      Proc.Start(); 

      while (true) 
      { 
       if (Proc.WaitForExit(100)) 
       { 
        break; 
       } 
       else if (this.Flag.WaitOne(100)) 
       { 
        Proc.Kill(); 
        break; 
       } 
       Thread.Sleep(5000); 
      } 
      this.Flag.Set(); 
     } 
    } 

    public bool critical { get { return _critical; } } 

} 
+0

關閉爲什麼?問題在於爲什麼進程在創建它們的線程關閉之後仍然存在......以及如何解決這個問題。 – Izzy

回答

1

它不工作,因爲殺死線程不會自動殺死你產生了過程(獨立的)。一般來說,殺死一個線程是不好的做法。您應該指示線程退出,以便它可以進行清理(將流程關閉),並返回乾淨。

+0

是的。我通常指示線程退出,但Proc.Kill()似乎不是WAI,即使我在主進程中放棄線程以退出足夠快時,JVM仍然保留。 – Izzy

+0

所以你的問題是你在新進程主線程上調用Abort並且JVM不能退出?或者說,Proc.Kill似乎並沒有殺死這個進程? –

+0

該標誌在線程中止(短時間之後)之前在主進程中設置,因此都是。 - 主進程確實檢測到兩個進程中的一個完成並退出並嘗試殺死另一個進程但是失敗 – Izzy