2016-04-11 6 views
0

c#圧縮ファイルからファイルを抽出するアプリケーションbackgroundworkerがあります。C#.net backgroundworker thread not handles handles

backgroundworkerが完了したことに気付きました。

次に、抽出されたファイルがbackgroundworkerになると、IOExceptionという名前のディレクトリが削除され、そのディレクトリとファイルが使用中であることがわかります。

私はprocessexplorer.exeを使用しました。このプロセスはC#アプリケーションです。私は電話し、backgroundworker.CancelAsync().Dispose()であることを確認しようとしました。ハンドルがファイルに残っている理由は分かりません。

私のアプリケーションを閉じて再度起動すると、抽出された一時的な場所から起動時にファイルが削除されます。アプリケーションの起動時に一時的な場所から抽出されたファイルを消去するコードがあります。

圧縮ファイルからそれらを抽出して作成したディレクトリとファイルを完全に削除することはできないようですが、私のアプリケーションには前述のファイルとディレクトリに対するハンドルがまだ開いているスレッドがあります。

私はこれらのディレクトリとファイルを強制的に削除することができますか?自分の作成と現在の処理を担当していますか?

圧縮ファイルを解凍している外部の.exeのコードです。「使用」ブロックは使用していませんでしたが、それを変更して助けにはなりませんでした。

using (Process proc = new Process()) 
     { 
      proc.StartInfo.FileName = "cmd"; 
      proc.StartInfo.Arguments = param; 
      proc.StartInfo.CreateNoWindow = true; 
      proc.StartInfo.RedirectStandardError = true; 
      proc.StartInfo.RedirectStandardOutput = true; 
      proc.StartInfo.RedirectStandardInput = true; 
      proc.StartInfo.UseShellExecute = false; 
      proc.Start(); 

      StreamReader reader = proc.StandardOutput; 
      while (!reader.EndOfStream) 
      { 
       lines.Add(reader.ReadLine()); 
      } 
      reader.Close(); 
      proc.WaitForExit(); 
     } 
+4

このようなことを防ぐには、ファイルストリームは 'using()'ブロックの内側にある必要があります。 – caesay

+2

塩鉱山で20年以上の間、私は事実のために驚異的な数のものを知っていました。彼らの約90%は絶望的な妄想でした。あなたは「事実のためにこれを知っていますか」 Dispose()を呼び出すために*保証されている 'using'ブロックを使用する代わりに、なぜDispose()を呼び出していますか?デバッガのワーカースレッドコードをトレースしてDispose()呼び出しに到達できますか?あなたのコードを見ることはできますか? –

+0

私はcaesayと一緒にいます - ファイル処理コードをUsingに入れ、必要なファイルを実行します。また、そのベストプラクティス。 – Hexie

答えて

1

どのように解凍を処理しているかわかりませんが、何が起きているのかはすぐに分かりません。しかし、BackgroundWorkerを取り除くことは、内部のすべてを処理するものではありません。代わりに、作業の中で、ファイルを適切に閉じるか、ハンドルを解放するなどしてください。ワーカースレッドにはインスタンスがありますが、アプリケーションはハンドルを所有しています。スレッドが終了すると、まだ開いているハンドルを保持することは可能です。 File.Close()のようなものが実行されていることを確認してください。これを行うと、アプリケーション(またはその外部のもの)は削除を続行できます。

関連する問題