Используя StreamWriter 'File.AppendText', ошибки с 'используется другим процессом' [duplicate]

Попробуйте:

<input type="submit" style="position: absolute; left: -9999px"/>

Это приведет к нажатию кнопки waaay влево, вне экрана. Хорошая вещь с этим - вы получите грациозное ухудшение при отключении CSS.

Обновление - обход для IE7

Как было предложено Брайаном Даунинг + с помощью tabindex, чтобы предотвратить вкладку нажмите эту кнопку (Ates Goral):

<input type="submit" 
       style="position: absolute; left: -9999px; width: 1px; height: 1px;"
       tabindex="-1" />
24
задан Cœur 18 March 2017 в 09:48
поделиться

5 ответов

C # с именем EventWaitHandle - путь сюда. Создайте экземпляр дескриптора ожидания в каждом процессе, который хочет использовать этот файл, и дайте ему имя, которое будет использоваться всеми этими процессами.

EventWaitHandle waitHandle = new EventWaitHandle(true, EventResetMode.AutoReset, "SHARED_BY_ALL_PROCESSES");

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

waitHandle.WaitOne();
/* process file*/
waitHandle.Set();

Когда вы называете дескриптор ожидания события, это имя является общим для всех процессов в операционной системе. Поэтому, чтобы избежать возможности столкновений, используйте руководство для имени («SHARED_BY_ALL_PROCESSES» выше).

36
ответ дан bytefire 15 August 2018 в 15:42
поделиться
  • 1
    Это очень помогает мне. Большое спасибо, @bytefile. – Lcng 9 September 2013 в 09:59
  • 2
    Я получаю эту ошибку. Доступ к пути '1ff907fa-6e1f-4520-bfde-d1815377c02c' отклонен. – Saeed Neamati 7 December 2015 в 08:22
  • 3
    Безопасно ли использовать using (var handle = new EventWaitHandle(...)){handle.WaitOne(); ... handle.Set();}, или я должен обернуть все в try{..}finally{handle.Set();}? Будет ли Dispose() установить дескриптор свободным? – dmigo 5 January 2016 в 16:18
  • 4
    Спасибо тебе за это!!! – misshomme 26 August 2016 в 11:36
  • 5
    Используйте его так: if(waitHandle.WaitOne())) try{ ...}finally{waitHandle.Set();} В случае исключений – schoetbi 28 November 2016 в 13:08

C # имеет встроенный lock, и вы можете использовать его, создав статический объект, для которого все потоки имеют доступ к:

private static object lockObject {get;set;}

public static object LockObject {get{return lockObject ?? lockObject = new object();}}


void YourMethod()
{
   lock(LockObject)  // all other threads will wait for y
   {
      using(var lockFileStream = File.Open("Lock.txt", FileMode.Open, FileAccess.Read, FileShare.None))
      {
         //Do what you need with the file.  
      }

   }
}

Это создает подход Thread Thread для вашей проблемы.

1
ответ дан bluetoft 15 August 2018 в 15:42
поделиться
  • 1
    Спасибо. Но похоже, что блокировка ключевых слов не может мне помочь. – Lcng 9 September 2013 в 07:24
  • 2
    Это не компилируется. Легче и чище иметь что-то вроде: private static object _lockObject = new object (); для объекта блокировки. – jstuardo 6 April 2018 в 19:10

Мьютекс в C # может использоваться для нескольких процессов. Вот пример для нескольких процессов, записывающих в один файл:

using (var mutex = new Mutex(false, "Strand www.jakemdrew.com"))
{
    mutex.WaitOne();
    File.AppendAllText(outputFilePath,theFileText);
    mutex.ReleaseMutex();
}

Вам нужно убедиться, что мьютексу присвоено уникальное имя, которое будет совместно использоваться во всей системе.

Дополнительное чтение здесь:

http://www.albahari.com/threading/part2.aspx#_Mutex

7
ответ дан Jake Drew 15 August 2018 в 15:42
поделиться

Если бы это был я, я бы установил что-то вроде SQL Server Compact Edition для чтения / записи этих данных.

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

Класс Mutex - это .Net-оболочка вокруг механизма блокировки уровня OS.

Обзор примитивов синхронизации

0
ответ дан Jeremy Bell 15 August 2018 в 15:42
поделиться
  • 1
    Спасибо, Джереми Белл. У меня нет базы данных в моей производственной среде. То, что я на самом деле делаю, заключается в следующем: я пишу службу Windows для мониторинга сетевого использования указанного процесса и записи результата в файл ABC.txt за 10 минут. В этом заданном процессе он будет читать его использование в сети из файла ABC.txt в любое время, когда он загружает какие-либо вещи. Фактически, файл ABC.txt доступен двумя процессами, а не двумя потоками в одном процессе. – Lcng 9 September 2013 в 06:52
  • 2
    Вещь, которую вы ищете, называется Mutex - msdn.microsoft.com/en-us/library/system.threading.mutex.aspx – Jeremy Bell 9 September 2013 в 14:56
  • 3
    Спасибо, @ Джереми Белл. Либо EventWaitHandle , либо Mutex может мне помочь. Спасибо за ваш ответ. – Lcng 10 September 2013 в 02:57

Ваше решение подвержено ошибкам. Вы в основном реализовали блокировку с двойным проверкой ( http://en.wikipedia.org/wiki/Double-checked_locking ), которая может быть очень опасной.

Лучшее решение чтобы либо вводить изоляцию потоков, когда только один поток когда-либо обращается к файлу, и делает это, читая из очереди, по которой запросы на чтение или запись помещаются другими потоками (и, конечно, очередь защищена взаимоисключающим доступом по потокам) или где потоки синхронизируются либо с помощью устройств синхронизации (секции lock, либо mutotes, либо), либо с использованием какой-либо другой логики доступа к файлу (например, System.IO.FileShare).

3
ответ дан Omaha 15 August 2018 в 15:42
поделиться
  • 1
    Спасибо. «делает это путем чтения из очереди», возможно, необходима очередь. Но по мере того, как я редактировал, я хочу читать и писать в файл ABC.txt в двух разных потоках. Как я сохраняю эту очередь? Должен ли я сохранять эту очередь в третьем процессе или в эфире одного из двух существующих процессов? А как получить доступ к этим процессам? Должен ли я использовать WCF или другие технологии? – Lcng 9 September 2013 в 07:23
Другие вопросы по тегам:

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