2010-11-19 8 views
3

try/catch内でプロセスを開始するforeachループがあります。私のtry/catchのfinallyセクションでは、最終的には、プロセスがどのファイルに対してもハンドルを持たないようにしています。私は処理されていたファイルを削除する必要があります。C#プロセスがファイルのハンドルを解放するまでのブロックコード

私が試したことはありません。私はSystem.IOの例外を引き続き取得します。 "ファイルは現在別のプロセスで使用されています。"

最後に、このメソッドから戻る前にWaitForExit()を使用しています。次のメソッド呼び出しはファイルを削除するものです。このプロセスの後に、プロセスがまだ開いているか、これらのファイルのいずれかにハンドルがあるのはなぜですか?

ありがとうございます!

try 
{ 
    foreach (var fileInfo in jsFiles) 
    { 
    //removed for clarity 
    _process.StartInfo.FileName = "\"C:\\Program Files\\Java\\jre6\\bin\\java\""; 
    _process.StartInfo.Arguments = stringBuilder.ToString(); 
    _process.StartInfo.UseShellExecute = false; 
    _process.StartInfo.RedirectStandardOutput = true; 
    _process.Start(); 
    } 
} 
catch (Exception e) 
{ 
    BuildMessageEventArgs args = new BuildMessageEventArgs("Compression Error: " + e.Message, 
           string.Empty, "JSMin", MessageImportance.High); 
    BuildEngine.LogMessageEvent(args); 

} 
finally 
{ 
    _process.WaitForExit(); 
    _process.Close(); 
} 

答えて

2

あなたのコードを再構成する必要があると思います。 foreachのいずれかのプロセスで障害が発生すると、ループが終了します。すべてが成功しても、とCloseブロックの呼び出しは、上記ループの最後のプロセスにのみ対応します。

各プロセスとその成功と失敗を個別に処理する必要があります。 fileInfoパラメータを受け入れ、各プロセスを起動して待機するメソッドを作成します。提案されたメソッドを呼び出すクライアントコードにループを移動します。

+0

提案していただきありがとうございます。 – Nick

0

プロセスはコンソールアプリケーションかGUIアプリケーションですか?

GUIアプリケーションでは、Process.CloseMainWindowを実行する必要があります。

3

ここには深刻な問題があります。あなたは一連のプロセスを開始していますが、が最後にが終了するまで待つだけです。

foreachをtryブロックの外側にしたくないですか?

具体的に何をしようとしているかについて詳しくお知りになりたい場合は、より良い提案をすることができます。

+0

これは確かに問題です。私はStart()を誤解しました。元のプロセスが再利用されたという印象を受けました。これは、プロセスがなぜオープンなままであるように見えるのかを確かに説明するでしょう。私はこのセクションを書き直すつもりです。ありがとう。 – Nick

0
foreach (var fileInfo in jsFiles) 
{ 
    using (Process process = new Process()) 
    { 
     try 
     { 
      //Other stuff 
      process.Start(); 
     } 
     catch (...) 
     { 
      //Exception Handling goes here... 
     } 
     finally 
     { 
      try 
      { 
       process.WaitForExit(); 
      } 
      catch (...) 
      { 
      } 
     } 
    } 
} 
  1. Process.WaitForExit()それはそれ自身ののtry/catchを必要とするので、例外をスローする可能性があります。
  2. usingステートメントでプロセスを作成する場合は、プロセスを閉じることを心配する必要はありません.Netは正しく処分します。
  3. ローカル変数の前にアンダースコアを付けないほうがよいでしょう。ほとんどの人は、自分のフィールドにそれを使っています。
関連する問題