2012-02-02 4 views
2

CurlFile()が呼び出されるたびに、ProcessObjectクラスから新しいオブジェクトが作成されます。 ProcessObjectオブジェクトは、新しいプロセスを開始します。親クラスの静的イベントハンドラをトリガする各オブジェクトのProcess.Exitイベントが必要ですが、何らかの理由で機能していないようです。親クラスの静的イベントハンドラがネストされたクラスのProcess.Exitedからトリガされない

class Curl 
{ 
    StringContainer oStrings = new StringContainer(); 
    private static int _counter = 0; 
    private string _curl; 

    public Curl() 
    { 
     //oStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     _curl = oStrings.Curl; 
    } 

    public void CurlFile(string _arg) 
    { 
     ProcessObject oProcessObject = new ProcessObject(_arg, _curl); 
    } 

    private static void oProcess_Exited(object sender, EventArgs e) 
    { 
     _counter++; 
     if (_counter == 1000) 
     { 
      MessageBox.Show("here"); 
     } 
    } 

    private class ProcessObject 
    { 
     ProcessStartInfo oStartInfo = new ProcessStartInfo(); 
     Process oProcess = new Process(); 

     public ProcessObject(string _arg, string _curl) 
     { 
      oStartInfo.FileName = _curl; 
      oStartInfo.Arguments = _arg; 
      oProcess.EnableRaisingEvents = true; 
      oProcess.Exited += new EventHandler(oProcess_Exited); 
      oProcess = Process.Start(oStartInfo); 
     } 
    } 
} 
+1

ガベージコレクタによってオブジェクトが収集されています。また、デザイン、ああ... – Will

答えて

1

最初に、@Willは、GCオブジェクトを取得しないように、プロセスオブジェクトへの参照を保持する必要があります。また

class Curl 
{ 
    internal static List<ProcessObject> _processes = new List<ProcessObject>(); 

    // .... 

    private static void oProcess_Exited(object sender, EventArgs e) 
    { 
     var p = sender as Process; 
     if (p != null && _processes.Contains(p)) 
      _processes.Remove(p); 

     _counter++; 
     if (_counter == 1000) 
     { 
      MessageBox.Show("here"); 
     } 
    } 

    public ProcessObject(string _arg, string _curl) 
    { 
     oStartInfo.FileName = _curl; 
     oStartInfo.Arguments = _arg; 
     oStartInfo.UseShellExecute = false; 
     oProcess.EnableRaisingEvents = true; 
     oProcess.Exited += new EventHandler(oProcess_Exited); 
     oProcess = Process.Start(oStartInfo); 
     Curl._processes.Add(oProcess); 
    } 
} 

some people have foundとして、Processクラスが出口を検出についてまだらになります。この(未テストコード)のようなもの。これがExitedイベントでも当てはまるのかどうかは分かりませんが、私はそれを気にして、上記のように明示的にUseShellExecute = false;を設定します。