Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileStream锁定用于读写的文件_C#_Multithreading_Locking_Filestream - Fatal编程技术网

C# FileStream锁定用于读写的文件

C# FileStream锁定用于读写的文件,c#,multithreading,locking,filestream,C#,Multithreading,Locking,Filestream,下面的代码块让我头疼 从逻辑上讲,它应该可以工作,因为我正在使用filestream在using语句中提供锁。当它到达创建StreamWriter的行时,它无法说出“文件不可写” 现在我的程序是一个多线程应用程序。任何线程都可能试图写入此文件。我需要程序锁定文件,读取内容,检查内容,然后写回任何更改。在此过程中,其他线程都不能访问该文件 using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShar

下面的代码块让我头疼

从逻辑上讲,它应该可以工作,因为我正在使用filestream在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) 
{
    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))
                {
                    // ...
                }
            }
        }