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