Сохранение C # Mutex живым в службе Windows - PullRequest
3 голосов
/ 09 августа 2011

Я написал приложение службы Windows на C #, которое читает файл через делегат таймера каждые 20 минут или около того, десериализует содержимое, а затем очищает файл.Файл записывается одним или несколькими клиентскими приложениями, работающими на той же машине, и я решил использовать Mutex для более или менее «блокировки» файла во время его десериализации и записи службой.

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

Я создаю Mutex внутри службы Windowsс помощью следующего кода C # (он запускается каждые 20 минут):

public void MyServiceFunction() {
        Mutex sessMutex = new Mutex(false, "sessMutex");
        sessMutex.WaitOne();
        // Write to the file ...... 
        sessMutex.ReleaseMutex();
}

В клиентском приложении я запускаю следующее:

public void MyClientFunction() {
    Mutex mutex = Mutex.OpenExisting("sessMutex");
    mutex.WaitOne();
    // Write to the file ...... 
    mutex.ReleaseMutex();
}

Теперь, если я запускаю службу Windows изапустите клиентское приложение в течение нескольких минут, все работает нормально.Однако через несколько часов при попытке запустить клиентское приложение я получаю следующую ошибку:

No handle of the given name exists.

У меня вопрос, как предотвратить возникновение этой ошибки и "сохранение" Mutex.

Будет ли работать Mutex как свойство класса обслуживания Windows?Является ли использование Mutex правильным способом для достижения нужной мне функциональности?

Заранее благодарен за помощь!

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Я не понимаю, почему вы относитесь к мьютексу по-разному в вашем клиенте.
Должен быть одинаковый код в обеих программах:

Mutex sessMutex = new Mutex(false, "sessMutex");
sessMutex.WaitOne();
// Write to the file ...... 
sessMutex.ReleaseMutex();
  1. Создать мьютекс - если мьютекс уже существует в системе, он вернет существующий мьютекс!
  2. Попробуйте заблокировать
  3. Запись в файл
  4. Снять блокировку
0 голосов
/ 09 августа 2011

Очевидно, что служба создает мьютекс, блокирует его и запускает файловые операции, затем освобождает его, а затем, как только этот метод теряет область действия, он подходит для сборки мусора. Впоследствии, на клиенте, вы, кажется, предполагаете, что мьютекс все еще существует ... да, сохранение его в области обслуживания может работать, но тогда клиент все равно может вызвать это исключение, если служба по какой-либо причине закрылась. ваш клиент должен будет проверить, есть ли еще мьютекс. PS: тогда, если это не так, ваш сервис, вероятно, также не ..

...