shortspider
shortspider

Reputation: 1055

Prevent Reading and Writing to a File at the Same Time

I have a process that needs to read and write to a file. The application has a specific order to its reads and writes and I want to preserve this order. What I would like to do is implement something that lets the first operation start and makes the second operation wait until the first is done with a first come first served like of queue to access the file. From what I have read file locking seems like it might be what I am looking for but I have not been able to find a very good example. Can anyone provide one?

Currently I am using a TextReader/Writer with .Synchronized but this is not doing what I hoped it would.

Sorry if this is a very basic question, threading gives me a headache :S

Upvotes: 2

Views: 1613

Answers (2)

tomfanning
tomfanning

Reputation: 9660

It should be as simple as this:

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
        }
    }
}

Basically, define a lock object, then whenever you need to do something with your file, make sure you get a lock using the C# lock keyword. On reaching the lock statement, execution will block indefinitely until a lock has been obtained.

There are other constructs you can use for locking, but I find the lock keyword to be the most straightforward.

Upvotes: 3

user7116
user7116

Reputation: 64068

If you're using a current version of the .Net Framework, you can benefit from Task.ContinueWith.

If your units of work are logically always, "read some, then write some", the following expresses that intent succinctly and should scale:

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.

Upvotes: 2

Related Questions