Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# 在多线程期间替换文件中的行_C# - Fatal编程技术网

C# 在多线程期间替换文件中的行

C# 在多线程期间替换文件中的行,c#,C#,我有一个小的csv文件,大约有40行,每行30个字符。我也有几个线程在同一时间运行缓慢,所以他们很少会试图同时访问该文件,但这可能会发生。所以我需要确保他们在必要时都等待轮到 据我所知,我可以做到: string[] text = File.ReadAllLines(path); text[23] = "replacement"; File.WriteAllLines(path, text); 但这样做,我假设我正在冒着文件被readAllLines和WriteAllLines之间的不同线程更

我有一个小的csv文件,大约有40行,每行30个字符。我也有几个线程在同一时间运行缓慢,所以他们很少会试图同时访问该文件,但这可能会发生。所以我需要确保他们在必要时都等待轮到

据我所知,我可以做到:

string[] text = File.ReadAllLines(path);
text[23] = "replacement";
File.WriteAllLines(path, text);
但这样做,我假设我正在冒着文件被readAllLines和WriteAllLines之间的不同线程更新的风险

我想做的是:

using (FileStream fs = File.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
    StreamReader sr = new StreamReader(fs);
    StreamWriter sw = new StreamWriter(fs);
    //Replace the line
}

但是,我看不到使用FileStream对象或StreamWriter对象执行类似WRITEALLINES的操作的方法。有没有一种简单的方法可以做到这一点,或者我需要将每一行写入一个新文件,然后替换旧文件?

使用
StreamWriter
,您不需要指定写入所有行。你只要写下你所拥有的。使用
WriteLine
方法逐行写入文件,或者将文本数组合并成一个大字符串,然后使用
write
方法一次写入所有内容

至于防止多个线程同时访问您的文件,您应该使用锁

public static object FileAccessLock = new object(); // Put this in a global area.

lock(FileAccessLock)
{
    string[] text = File.ReadAllLines(path);
    text[23] = "replacement";
    File.WriteAllLines(path, text);
}
锁一次只允许一个线程访问该代码段。所有其他线程将等待它完成


这并不意味着
File.writeAllines
方法不会被其他方法锁定,因此您应该在此处处理异常

使用
StreamWriter
无需指定写入所有行。你只要写下你所拥有的。使用
WriteLine
方法逐行写入文件,或者将文本数组合并成一个大字符串,然后使用
write
方法一次写入所有内容

至于防止多个线程同时访问您的文件,您应该使用锁

public static object FileAccessLock = new object(); // Put this in a global area.

lock(FileAccessLock)
{
    string[] text = File.ReadAllLines(path);
    text[23] = "replacement";
    File.WriteAllLines(path, text);
}
锁一次只允许一个线程访问该代码段。所有其他线程将等待它完成


这并不意味着
File.writeAllines
方法不会被其他方法锁定,因此您应该在此处处理异常

只需将写入锁定到一个线程访问。 像这样:

public class FileHelper
{
    private static object fileLock  = new object();
    public static void ReplaceLine(string path, int line, string replace)
    {
        lock(fileLock)
        {
            string[] text = File.ReadAllLines(path);
            text[line] = replace;      
            File.WriteAllLines(path, text);
        } 
    } 
} 

您只需要将写锁定到一个线程访问。 像这样:

public class FileHelper
{
    private static object fileLock  = new object();
    public static void ReplaceLine(string path, int line, string replace)
    {
        lock(fileLock)
        {
            string[] text = File.ReadAllLines(path);
            text[line] = replace;      
            File.WriteAllLines(path, text);
        } 
    } 
}