C#.net后台工作线程未关闭句柄

本文关键字:关闭句柄 线程 工作 net 后台 | 更新日期: 2024-07-27 05:00:51

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

我注意到backgroundworker确实完成了。

如果我尝试通过backgroundworker删除文件提取到的目录,我会得到一个IOException,告诉我该目录和文件正在使用中。

我使用了processexplorer.exe,这个过程就是我的C#应用程序。我试着打电话确认backgroundworker.CancelAsync().Dispose()。我不明白为什么句柄还在文件上?

如果我关闭我的应用程序并重新启动它,文件在启动时会从提取到的临时位置删除,因为我在启动应用程序时有代码可以从临时位置清除任何提取的文件。

我似乎无论如何都找不到完全删除目录和文件的方法,我知道我是通过从压缩文件中提取创建的,而且我的应用程序有一个线程,仍然可以打开这些文件和目录的句柄。

我是否可以强制删除这些目录和文件,因为我知道我要对它们的创建和当前处理负责?

这是我为external.exe解压压缩文件的代码,我一开始没有使用"using"块,但更改了它,没有帮助。

 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();
        }

C#.net后台工作线程未关闭句柄

如果不了解您是如何处理解压缩的,则不会立即发现发生了什么。然而,去掉BackgroundWorker并不能处理它内部的一切。相反,在正在完成的工作中,你应该正确地关闭文件、释放句柄等。工作线程有实例,但应用程序拥有句柄。当线程结束时,仍然可以保留打开的句柄。确保像File.Close()这样的事情正在进行。如果你这样做,你的应用程序(或它之外的任何东西)将能够继续删除。