Хочу записать в файл, но могу иметь потенциально несколько устройств записи сразу, должен заблокировать

Для целых чисел не требуется никаких дополнительных манипуляций.

Это будет соответствовать каждой цифре с конца, имеющей 1 или более двухзначный шаблон после, и замените ее на себя + ",":

"125465778".replace(/(\d)(?=(\d\d)+$)/g, "$1,");
-> "1,25,46,57,78"

Но поскольку мы хотим иметь 3 в конце, давайте укажем это явно, добавив дополнительные «\ d» до окончания конца ввода:

"125465778".replace(/(\d)(?=(\d\d)+\d$)/g, "$1,");
-> "12,54,65,778"
6
задан Constantin 4 October 2008 в 15:30
поделиться

6 ответов

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

lock(this)
{
  // perform the write.
}

Обновление: Я предположил, что у Вас есть общий объект. Если бы это различные процессы на той же машине, Вам было бы нужно что-то как Именованное Взаимное исключение. Looky здесь для примера

2
ответ дан 17 December 2019 в 07:10
поделиться

не лучше заблокировать переменную объекта, а не целый экземпляр?

1
ответ дан 17 December 2019 в 07:10
поделиться

Операции Файлового ввода-вывода, которые пишут в файл, автоматически заблокируют файл. Проверьте, заблокирован ли файл (путем попытки записи) и если это, не пишут. Прежде, чем сделать любые записи, проверьте метку времени на файле и посмотрите если его больше чем 15 минут.

afaik Вы не можете записать в файл без него заблокированный Windows/независимо от того, что.

Теперь все, это уехало в Вас, должно искать, как сделать вышеупомянутое использование MSDN (извините, я не могу быть побеспокоен для поиска всего этого, и я не помню классы C# очень хорошо).:)

1
ответ дан 17 December 2019 в 07:10
поделиться

Я не убежден, что блокировка.NET применима к различным процессам. Кроме того, заблокируйте (это) только исключит другие потоки, которые выполняют метод на том же экземпляре "этого" - таким образом, другие потоки даже в том же процессе могли работать сразу на различных экземплярах.

Принятие всех Ваших процессов работает на той же машине, захват файла должен сделать это все же.

Если Вы находитесь на различных машинах, Ваш пробег может варьироваться - win32, утверждает, что имел захват файла, который работает по сети, но исторически приложения, которые полагаются на него (Думают MSAccess) имеют проблемы с повреждением файла так или иначе.

0
ответ дан 17 December 2019 в 07:10
поделиться

Используйте блокировки файловой системы

Как предложенные другие, блокировки.NET будут иметь ограниченное применение в этой ситуации. Вот код:

FileInfo fi = new FileInfo(path);
if (fi.Exists
    && (DateTime.UtcNow - fi.LastWriteTimeUtc < TimeSpan.FromMinutes(15)) {
  // file is fresh
  return;
}

FileStream fs;
try {
  fs = new FileStream(
    path, FileMode.Create, FileAccess.Write, FileShare.Read);
} catch (IOException) {
  // file is locked
  return;
}

using (fs) {
  // write to file
}

Это будет работать через потоки и процессы.

0
ответ дан 17 December 2019 в 07:10
поделиться
   // try enter will return false if another thread owns the lock
   if (Monitor.TryEnter(lockObj))
   {
      try
      {
         // check last write time here, return if too soon; otherwise, write
      }
      finally
      {
         Monitor.Exit(lockobj);
      }
   }
0
ответ дан 17 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: