C# 如何避免文件阻塞
我们正在监视一个定制应用程序(其源不在我们的控制之下)写入XML清单的进度。有时,应用程序由于无法写入清单文件而被卡住。尽管我们通过使用file.Close显式关闭文件句柄并在使用块中创建文件变量来覆盖跟踪。但不知何故,它一直在发生。(我们的应用程序是多线程的,最多可以有三个线程访问该文件。) 另一件有趣的事情是,他们的应用程序在三个不同的事件(添加项目、删除项目、完成项目)中更新此清单,但我们只遇到一个事件(完成项目)。我的代码列在这里C# 如何避免文件阻塞,c#,.net,multithreading,file-io,C#,.net,Multithreading,File Io,我们正在监视一个定制应用程序(其源不在我们的控制之下)写入XML清单的进度。有时,应用程序由于无法写入清单文件而被卡住。尽管我们通过使用file.Close显式关闭文件句柄并在使用块中创建文件变量来覆盖跟踪。但不知何故,它一直在发生。(我们的应用程序是多线程的,最多可以有三个线程访问该文件。) 另一件有趣的事情是,他们的应用程序在三个不同的事件(添加项目、删除项目、完成项目)中更新此清单,但我们只遇到一个事件(完成项目)。我的代码列在这里 using (var st = new FileStre
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
}
}
问题是不同的,因为这个人对所有进程的文件访问拥有完全控制权,而正如我提到的,一个进程是没有源访问的第三方。我们的应用程序运行良好。然而,如果他们无法获得文件的控制权,他们的应用程序似乎被卡住了。因此,我愿意找到一种不干扰其运行的文件访问方法。如果您只读取文件,那么您应该能够传递一个标志来指定共享模式。我不知道您是如何在.NET中指定这个的,但是在WinAPI中,您会将
文件\u共享\u读取|文件\u共享\u写入
传递到创建文件()
我建议您查看文件API文档,看看其中提到了共享模式。两件事:
范围之外执行其余操作。这样,您就不会冒使用封闭流和读卡器的风险。另外,您不需要使用Close
方法,因为当您退出using
语句的作用域时,会调用Dispose
,这是等效的
FileShare
枚举的重载。锁定本质上是偏执的,因此文件可能会自动锁定以保护您免受自己的伤害。:)李>
HTH.如果一个线程试图读取文件,而另一个线程正在写入,则可能发生这种情况。要避免这种一次需要多个读卡器但只需要一个写卡器的情况,请使用System.Threading命名空间中的ReaderWriterLock或.NET 2.0中的ReaderWriterLockSlim类。此外,如果使用.NET 2.0+,可以将代码简化为:
string xmlText = File.ReadAllText(ManifestFile);
另请参见:。是的,有一个FileShare常量。谢谢,我将尝试一下,看看它是如何工作的。谢谢,添加了一个FileShare常量,这两个应用程序的线程似乎相互理解。由于我们的应用程序正在读取,所以我对其他文件使用了READ_WRITE属性。因此他们的应用程序总是打开该文件。希望下面的链接有帮助。正确的做法是使用锁定,这样线程就不会同时尝试访问文件。当我有多个线程登录到同一个文件时,它为我工作。创建一个库来管理对文件的访问,您就成功了。