C# 防止同时读取和写入文件

C# 防止同时读取和写入文件,c#,multithreading,locking,C#,Multithreading,Locking,我有一个需要读写文件的进程。应用程序的读写有一个特定的顺序,我想保留这个顺序。我想做的是实现一些东西,让第一个操作开始,让第二个操作等待,直到第一个操作完成,然后使用先到先得的队列访问文件。从我所读到的资料来看,文件锁定似乎就是我所寻找的,但我还没有找到一个很好的例子。有人能提供吗 目前,我正在使用带有.Synchronized的TextReader/Writer,但这并没有达到我所希望的效果 抱歉,如果这是一个非常基本的问题,线程让我头疼:S它应该像这样简单: public static re

我有一个需要读写文件的进程。应用程序的读写有一个特定的顺序,我想保留这个顺序。我想做的是实现一些东西,让第一个操作开始,让第二个操作等待,直到第一个操作完成,然后使用先到先得的队列访问文件。从我所读到的资料来看,文件锁定似乎就是我所寻找的,但我还没有找到一个很好的例子。有人能提供吗

目前,我正在使用带有.Synchronized的TextReader/Writer,但这并没有达到我所希望的效果


抱歉,如果这是一个非常基本的问题,线程让我头疼:S

它应该像这样简单:

public static readonly object LockObj = new object();

public void AnOperation()
{
    lock (LockObj)
    {
        using (var fs = File.Open("yourfile.bin"))
        {
            // do something with file
        }
    }
}

public void SomeOperation()
{
    lock (LockObj)
    {
        using (var fs = File.Open("yourfile.bin"))
        {
            // do something else with file
        }
    }
}
基本上,定义一个锁对象,然后无论何时需要对文件执行某些操作,确保使用C#
lock
关键字获得锁。到达
lock
语句时,执行将无限期地阻塞,直到获得锁为止


您还可以使用其他构造进行锁定,但我发现
lock
关键字是最简单的。

如果您使用的是当前版本的.Net Framework,您可以从中受益

如果您的工作单元在逻辑上始终是“读一些,然后写一些”,那么以下内容将简洁地表达您的意图,并应按比例进行调整:

string path = "file.dat";

// Start a reader task
var task = Task.Factory.StartNew(() => ReadFromFile(path));

// Continue with a writer task
task.ContinueWith(tt => WriteToFile(path));

// We're guaranteed that the read will occur before the write
// and that the write will occur once the read completes.
// We also can check the antecedent task's result (tt.Result in our
// example) for any special error logic we need.

框架的哪个版本?每个工作单元将有一个读卡器,然后是一个写卡器。NET4.5是的,将有一个读卡器,然后是一个写卡器。我不确定我是否理解第二个问题,但是读和写是独立的,不耦合的。我想问的是,读是否总是在写之前?啊,好的,是的,在写之前总是有读。锁对象不需要是文件流本身吗?可以。不一定是。出于习惯,我使用了一个单独的
新对象()。这也允许锁定值类型。@shortspider:如果你将读写抽象到一个类中,你可以使用流本身作为锁定对象。我认为将锁定对象设为流本身并不明智。您最好尽快关闭并处理流。由于锁操作使用内存地址,任何新创建的流都很可能是另一个地址,因此您也必须管理该地址。另外,如果我没有弄错的话,指导方针推动使用单独的锁对象。似乎是明智的。实际上,指导方针似乎促进了实例方法的
lock(this)
,静态方法的
lock(typeof(ContainingClass))
。然而,在相关示例中,
lock(lockObj)
在MSDN中被广泛使用。我选择后者,因为我喜欢更细粒度的控件。