如何避免文件阻止

时间:2008-10-20 11:25:45

标签: c# .net multithreading file-io

我们正在监控自定义应用程序(其源不在我们的控制之下)的进度,该应用程序写入XML Manifest。有时,由于无法写入Manifest文件,应用程序卡住了。虽然我们通过使用File.Close显式关闭文件句柄并在Using Blocks中创建文件变量来覆盖我们的跟踪。但不知怎的,它一直在发生。 (我们的应用程序是多线程的,最多三个线程可能正在访问该文件。) 另一个有趣的事情是他们的应用程序在三个不同的事件(添加项目,删除项目,完成项目)更新此清单,但我们只遭受一个事件(项目完成)。我的代码列在这里

using (var st = new FileStream(MenifestPath, FileMode.Open, FileAccess.Read))
{
    using (TextReader r = new StreamReader(st))
    {
       var xml = r.ReadToEnd();
           r.Close();
           st.Close();
          //................ Rest of our operations
    }
}

5 个答案:

答案 0 :(得分:2)

如果您只是从文件中读取,那么您应该能够传递一个标志来指定共享模式。我不知道你如何在.NET中指定它,但是在WinAPI中你将FILE_SHARE_READ | FILE_SHARE_WRITE传递给CreateFile()

我建议您查看文件API文档,了解它提到的共享模式的位置。

答案 1 :(得分:1)

两件事:

  1. 您应该在using语句的范围之外执行其余操作。这样,您就不会有使用封闭流和阅读器的风险。此外,您不需要使用Close方法,因为当您退出using语句的范围时,将调用Dispose,这是等效的。
  2. 您应该使用具有FileShare枚举的重载。锁定本质上是偏执的,因此文件可能会被自动锁定以保护您自己。 :)
  3. HTH。

答案 2 :(得分:0)

问题是不同的,因为该人对所有进程的文件访问权限有完全控制权,而正如我提到的一个进程是第三方没有任何来源的能力。我们的应用程序运行正常。但是,如果他们无法控制文件,他们的应用程序似乎停滞不前。所以我愿意找到一种不会影响其运行的文件访问方法。

答案 3 :(得分:0)

如果一个线程试图从文件读取而另一个线程正在写入,则可能发生这种情况。要避免这种情况,您需要多个读取器,但一次只需要一个编写器,请在System.Threading命名空间中使用ReaderWriterLock或.NET 2.0中的ReaderWriterLockSlim类。

答案 4 :(得分:0)

此外,如果您使用的是.NET 2.0+,则可以将代码简化为:

string xmlText = File.ReadAllText(ManifestFile);

另请参阅:File.ReadAllText on MSDN