2014-09-07 2 views
1

Мне нужно работать с одним файлом (чтение и запись) из РАЗНЫХ процессов. Поскольку существует конкуренция между процессами, необходимо заблокировать файл. В настоящее время регистрация осуществляется следующим образом:Атомные операции над файлом из разных процессов

const int MAX_RETRY = 50; 
const int DELAY_MS = 200; 
bool Success = false; 
int Retry = 0; 
while (!Success && Retry < MAX_RETRY) 
{ 
    try 
    { 
     using (StreamWriter Wr = new StreamWriter(ConfPath)) 
     { 
      Wr.WriteLine("My content"); 
     } 
    } 
    catch (IOException) 
    { 
     Thread.Sleep(DELAY_MS); 
     Retry++; 
    } 
} 

Есть ли надлежащее решение моей проблемы?

+0

Do оба процесса делать как операции чтения и записи? –

+0

Оба процесса могут читать и записывать в файл. – qwerty666

+0

вы можете использовать мьютексы, см. Http://stackoverflow.com/questions/2830546/cross-user-c-sharp-mutex –

ответ

0

Вы можете использовать Named Mutex делить блокировку между процессами:

const int MAX_RETRY = 50; 
const int DELAY_MS = 200; 
bool Success = false; 
int Retry = 0; 

// Will return an existing mutex if one with the same name already exists 
Mutex mutex = new Mutex(false, "MutexName"); 
mutex.WaitOne(); 

try 
{ 
    while (!Success && Retry < MAX_RETRY) 
    { 
     using (StreamWriter Wr = new StreamWriter(ConfPath)) 
     { 
      Wr.WriteLine("My content"); 
     } 
     Success = true; 
    } 
} 
catch (IOException) 
{ 
    Thread.Sleep(DELAY_MS); 
    Retry++; 
} 
finally 
{ 
    mutex.ReleaseMutex(); 
} 
+0

Если все процессы, которые обращаются к файлу, будут использовать мьютекс, тогда я смогу это сделать : http://pastebin.com/9MhaSzTs Будет ли это работать? – qwerty666

+0

Да, это точка общего мьютекса. Создавая его по имени и возвращая уже построенный мьютекс. –

Смежные вопросы