我有一个需要读取和写入文件的进程。该应用程序对其读写有特定的顺序,我想保留这个顺序。我想要做的是实现一些东西,让第一个操作开始并让第二个操作等到第一个操作完成,先到先服务,比如队列来访问文件。从我读过的文件锁定看来,这可能是我正在寻找的东西,但我找不到一个很好的例子。谁能提供一份?
目前我正在使用带有 .Synchronized 的 TextReader/Writer,但这并没有达到我希望的效果。
抱歉,如果这是一个非常基本的问题,线程让我头疼:S
我有一个需要读取和写入文件的进程。该应用程序对其读写有特定的顺序,我想保留这个顺序。我想要做的是实现一些东西,让第一个操作开始并让第二个操作等到第一个操作完成,先到先服务,比如队列来访问文件。从我读过的文件锁定看来,这可能是我正在寻找的东西,但我找不到一个很好的例子。谁能提供一份?
目前我正在使用带有 .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 的当前版本,则可以从Task.ContinueWith
.
如果您的工作单元在逻辑上总是“读一些,然后写一些”,那么以下内容简洁地表达了该意图并且应该扩展:
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.