我们正在监控自定义应用程序(其源不在我们的控制之下)的进度,该应用程序写入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
}
}
答案 0 :(得分:2)
如果您只是从文件中读取,那么您应该能够传递一个标志来指定共享模式。我不知道你如何在.NET中指定它,但是在WinAPI中你将FILE_SHARE_READ | FILE_SHARE_WRITE
传递给CreateFile()
。
我建议您查看文件API文档,了解它提到的共享模式的位置。
答案 1 :(得分:1)
两件事:
using
语句的范围之外执行其余操作。这样,您就不会有使用封闭流和阅读器的风险。此外,您不需要使用Close
方法,因为当您退出using
语句的范围时,将调用Dispose
,这是等效的。FileShare
枚举的重载。锁定本质上是偏执的,因此文件可能会被自动锁定以保护您自己。 :)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。