C# FileStream锁定用于读写的文件
下面的代码块让我头疼 从逻辑上讲,它应该可以工作,因为我正在使用filestream在using语句中提供锁。当它到达创建StreamWriter的行时,它无法说出“文件不可写” 现在我的程序是一个多线程应用程序。任何线程都可能试图写入此文件。我需要程序锁定文件,读取内容,检查内容,然后写回任何更改。在此过程中,其他线程都不能访问该文件C# FileStream锁定用于读写的文件,c#,multithreading,locking,filestream,C#,Multithreading,Locking,Filestream,下面的代码块让我头疼 从逻辑上讲,它应该可以工作,因为我正在使用filestream在using语句中提供锁。当它到达创建StreamWriter的行时,它无法说出“文件不可写” 现在我的程序是一个多线程应用程序。任何线程都可能试图写入此文件。我需要程序锁定文件,读取内容,检查内容,然后写回任何更改。在此过程中,其他线程都不能访问该文件 using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShar
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)
{
using(var sw = new StreamWriter(fs))
{
sw.Write(str + text);
}
}
我对线程做了一些假设,因此如果同步不起作用,您可能需要查找有关同步的信息,或者向我们提供更多信息
另外,请提前关闭StreamReader
(以防该方法提前返回)。使用后立即将其关闭,或者最好使用关闭方法中的使用
关闭StreamReader对象和基础流,然后释放
与读取器关联的任何系统资源
因此,对StreamWriter的后续调用似乎无法使用已关闭的资源,从而显示消息“文件不可写”
试试这个
using (var fs = File.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
using (var sr = new StreamReader(fs))
{
var str = sr.ReadToEnd();
// ...
using (var sw = new StreamWriter(fs))
{
// ...
}
}
}