Что происходит, когда несколько экземпляров приложения обращаются к одному и тому же файлу с StreamWriter в одно и то же время? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть приложение, которое может использоваться несколькими пользователями одновременно.Приложение использует API, и его токены должны время от времени обновляться.Токены сохраняются в файле.Когда необходимо обновить токены, файл перезаписывается новыми токенами.Меня беспокоит то, что в редких случаях возможно, что два экземпляра приложения будут пытаться выполнить запись в файл одновременно.Что происходит потом?Я хочу избежать ситуации, в которой у меня останется пустой файл.

Я прочитал другие связанные вопросы и увидел, что «операционная система их запланирует» и «все может произойти».Какой это?

Вот 5 рассматриваемых строк, если это поможет.Кроме того, в настоящее время это не происходит в отдельном потоке.

string newTokens = GetTokens();
using (StreamWriter writer = new StreamWriter("TokensFile.txt")) {
    writer.Write(newTokens));
    writer.Flush();
    writer.Close();
}

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

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

При запуске ваше приложение создаст / откроет Mutex.Затем, когда вам нужно получить доступ к файлу, который вы ждете, чтобы захватить мьютекс, сделайте ваш файл работоспособным и затем отпустите мьютекс.В случае сбоя вашего приложения операционная система автоматически отключает мьютекс.Так что это приятно и безопасно, а также просто в использовании.

0 голосов
/ 08 октября 2018

Файл будет иметь все, что написал последний автор.Предоставление писателю FileShare.ReadWrite позволит нескольким писателям использовать его:

string newTokens = GetTokens();
using (StreamWriter writer = new StreamWriter("TokensFile.txt", FileMode.Create, FileAccess.Write, FileShare.Readwrite)) {
    writer.Write(newTokens));
    writer.Flush();
    writer.Close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...