Обработка .lock файлов - PullRequest
       11

Обработка .lock файлов

0 голосов
/ 10 февраля 2011

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

Наше настольное приложение использует веб-службы для связи с этим сервером приложений, и каждый вход в систему с рабочего стола занимает пользовательский слот на сервере. Сервер приложений не предлагает никакой функциональности, которая позволяет нам выяснить, занят ли пользовательский слот или нет. Лучшим решением для нас было бы разработать приложение, которое находится в середине сервера приложений и нашего настольного клиента, это приложение будет управлять распределением и освобождением пользовательских слотов, и проблема будет решена. Это решение было отклонено, так как заказчик не хочет устанавливать наше приложение на сервер приложений электронного бизнеса, поскольку это лишит пользователя поддержки упомянутого сервера электронного бизнеса, альтернативой может быть дополнительный сервер, но он этого не делает. не хочу иметь дело.

Что дает нам решение о том, что наше настольное приложение имеет доступ на запись в общую папку. Каждое настольное приложение имеет UID, и мы используем этот UID вместе с идентификатором пользовательского слота и создаем файл UID.UserSlotId.locked. Это будет означать, что каждый раз при установлении соединения настольному приложению необходимо будет проверять это общее местоположение и удостовериться, что они не будут использовать выбранный UserSlotId.

Теперь я понял, что заблокированный файл - ужасное решение, но клиент запросил это, и сколько бы мы ни сообщали ему, что это никогда не будет водонепроницаемым решением, они все еще хотят идти вперед. Они предполагают, что 98% -ное решение является хорошим решением. Итак, что может предложить сообщество StackOverflow в качестве совета по работе с такой системой блокировки файлов?

1 Ответ

0 голосов
/ 11 февраля 2011

Откройте файл блокировки в режиме записи и оставьте его открытым, пока приложение использует слот.

private static void TakeFistUnusedLock(FileStream[] currentLock)
{
    for (int i = 1; i < 5; i++)
    {
        try
        {
            var fs = File.OpenWrite(Path.Combine(Path.GetTempPath(), "DbLock", i.ToString() + ".lock"));
            currentLock[i - 1] = fs;
            Console.WriteLine("Got lock " + i);
            break;
        }
        catch (Exception) { }
    }
}

Я тестировал вот так

FileStream[] currentLock = new FileStream[5];
var path = Path.Combine(Path.GetTempPath(), "DbLock");
DirectoryInfo di = new DirectoryInfo(path);
di.Create();


TakeFistUnusedLock(currentLock);
TakeFistUnusedLock(currentLock);
TakeFistUnusedLock(currentLock);

currentLock[1].Dispose(); // release lock 2

TakeFistUnusedLock(currentLock);

вывод был

Got lock 1
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
Got lock 2
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
Got lock 3
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
Got lock 2

Вместо сохранения массива currentLock вы сохраняете только одну блокировку для каждого приложения. Вам необходимо сохранить открытый FileStream, чтобы убедиться, что файл остается открытым в режиме записи. Чтобы снять блокировку, вы удаляете сохраненный FileStream, затем снимается блокировка записи в файле.
Этот метод обеспечивает снятие блокировок даже в случае сбоя приложения.

...