如何知道我的应用程序的哪个部分使用该文件

时间:2011-12-17 11:30:26

标签: c#

在我的应用程序中,我扫描图像并创建树视图,当我点击文件名时,我在imageViewer中显示图像,

但是当我使用删除目录后,我清除了树视图和imageviewer

treevImage.Nodes.Clear();
imageViewer.Image.Dispose();
imageViewer.Image = null;
Directory.Delete(localPath, true);

我得到一个例外,一个图像被另一个线程使用,问题是它是随机的,第一个或任何其他图像!

  

该进程无法访问文件'image9.tif',因为它正由另一个进程使用。

有没有办法知道我的应用程序的哪个部分使用该图像?

修改:

当我添加

imageViewer.Dispose();

应用程序删除文件无异常,但当我再次扫描时,我在imageViewer中显示新图像时出现异常

  

对象引用未设置为对象的实例。

编辑2:

dispose()的异常做法由 MikeNakis 更正但现在删除目录后我进行了新扫描并在dispose()和new之后在imageViewer中显示新图像;我无法看到新扫描的新图像

2 个答案:

答案 0 :(得分:2)

使用imageViewer.Dispose();处理了imageViewer后,您需要使用imageViewer = new ImageViewer();重新创建它。

答案 1 :(得分:0)

在关闭并处理文件之前,我偶尔需要等待几毫秒才能在同一个线程上读取文件 - 正如您在上面所描述的那样。我通过编写一个等到我对该文件具有独占访问权限的方法来解决这个问题。

File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None)

记得在该循环中放置一个thread.sleep。如果这会锁定你的程序,你就会忘记丢弃一些东西。

(我从未调查过为什么这是必需的,因为解决方法成功并且已经使用了近10年。可能是我的代码中的错误,但因为我在关闭/处理之前写入文件我怀疑我们的防病毒软件对文件进行了简短的锁定)

另一种解决方案是防止图像对象完全锁定文件。您可以将图像文件读入内存流,并从中实例化图像。只需确保您正确执行此操作,这样您就不会最终在内存中复制图像而不是必要的。