2012-01-05 4 views
1

I'm uring StreamReader читать/писать из файла в два потока, читать в одном и писать в другом. Я хочу, чтобы эти два не происходили одновременно. Какую блокировку я должен использовать? Я посмотрел несколько примеров, но они использовали FileStream.Lock, и я не уверен, могу ли я использовать это с StreamReader, поэтому, пожалуйста, уточните.C# file read/write lock

+2

просто любопытные ..но у них должны быть в разных потоках .. и у вас есть образец кода, который вы используете – MethodMan

+0

@DJKRAZE да, они должны быть в разных потоках. Поток, который пишет, на самом деле извлекает некоторые данные с удаленного сервера и добавляет некоторые из них в файл. – prongs

+1

Вы не можете использовать StreamReader для записи в файл. Конечно, вы имели в виду что-то еще, но нет смысла угадывать, что вам нужно что-то большее, чем простой * замок *. –

ответ

0

Вы можете создать свой собственный замок:

class Example 
{ 
    private static readonly object SyncRoot = new object(); 

    void ReadOrWrite() 
    { 
     lock(SyncRoot) 
     { 
      // Perform a read or write 
     } 
    } 
} 
+0

следует использовать вместо mutex? Я не знаю разницы ... – prongs

+0

symcroot может быть просто 'Object'? Я имею в виду не какой-то подкласс объекта? – prongs

+0

он статичен, поэтому он должен обрабатывать несколько потоков. он не должен быть подклассифицирован; единственная цель объекта SyncRoot должна быть заблокирована – Didaxis

1

вы можете использовать семафор

http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

+0

Семафор будет работать, но если порядок, в котором происходят события, важен, при использовании семафора нет очереди. Нет гарантий, какой поток получит блокировку после ее выпуска. – Darthg8r

1

В дополнение к блокировке самого файла, используйте ключевое слово "блокировки". В противном случае, вы будете бросать исключение при попытке работать с заблокированным файлом

private object lockObject = new Object(); 

// Code in thread that reads 
lock(lockObject) 
{ 
    // Open the file and do something 
    // Be sure to close it when done. 
} 


// Somewhere else in another thread 
lock(lockObject) 
{ 
    // Open the file for writing and do somethign with it 
    // Be sure to close it when done. 
} 
+1

блокировка блокировки вызовов? – prongs

+1

@prongs: Да, это так. Поток, ожидающий его получения, будет усыпан ОС до тех пор, пока блокировка не станет доступной. – Tudor