我有以下代码块让我头疼.
逻辑上它应该工作,因为我使用在using语句中提供锁的文件流.当它到达创建StreamWriter的行时,它无法说“文件不可写”.
现在我的程序是一个多线程应用程序.任何线程都可能尝试写入此文件.我需要程序来锁定文件,读取内容,检查内容,然后回写任何更改.在此过程中,没有其他线程应该能够访问该文件.
using (var fs = File.Open(fileLoc,FileMode.Open,FileAccess.ReadWrite,FileShare.None)) { var sr = new StreamReader(fs); var str = sr.ReadToEnd(); var strArray = str.Split(','); if (strArray.Any(st => st == text)) { return; } sr.Close(); var sw = new StreamWriter(fs); sw.Write(str + text); sw.Flush(); sw.Close(); }
解决方法
FileShare.None标志不会导致线程排队,它只是锁定文件,因此是您获得的异常.要提供互斥访问,您可以在写入之前锁定共享对象.
但是你说这个“现在我的程序是一个多线程应用程序.任何线程都可能试图写入这个文件.”现在,这些线程是否都使用完全相同的方法写入文件?让我们假设他们这样做,然后这应该工作……
创建一个静态类变量……
private static object lockObject = new object();
在这里使用它……
lock (lockObject) { var sw = new StreamWriter(fs); sw.Write(str + text); sw.Flush(); sw.Close(); }
我已经对线程做了一些假设,因此如果这不起作用或者向我们提供更多信息,您可能必须查找有关同步的信息.