C#.net backgroundworker线程没有关闭句柄

时间:2016-04-11 01:28:26

标签: c#

我的backgroundworker应用程序中有一个c#线程,用于从压缩文件中提取文件。

我注意到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();
        }

1 个答案:

答案 0 :(得分:1)

如果没有看到你如何处理减压,那么发生的事情并不是很明显。但是,摆脱BackgroundWorker并不能解决其中的所有问题。相反,在正在完成的工作中,您应该正确关闭文件,释放句柄等。工作线程具有实例,但应用程序拥有句柄。当线头结束时,它仍然可以保持打开的手柄。确保File.Close()之类的内容正在完成。如果您这样做,您的应用程序(或其他任何内容)将能够继续删除。