2014-09-02 2 views
0

У меня есть следующий код внутри созданного файла FileSystemWatcher. Таким образом, всякий раз, когда создается файл, он будет работать код ниже:XmlReader.Create получить «процесс не может получить доступ к файлу, потому что он используется другим процессом» ошибка

private static void FileWatch_RequestAdded(object sender, FileSystemEventArgs e) 
    { 
      try 
      { 
       RequestFile request = GetRequest(e.FullPath); 

       EventHandler<MESRequestEventArgs> requestReceived = Instance.RequestReceived; 
       if (requestReceived != null) 
       requestReceived(Instance, new MESRequestEventArgs(e.Name, request));    
      } 
      catch (Exception error) 
      { 
       MessageBox.Show(error.ToString()); 
      } 
    } 

private static object locker = new object(); 

public static RequestFile GetRequest(string filepath) 
{ 
    string filename = Path.GetFileName(filepath); 
    RequestFile file = new RequestFile(filename);   

    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.ValidationType = ValidationType.None; 

    lock (locker) 
    { 
     using (XmlReader reader = XmlReader.Create(filepath, settings)) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(RequestFile)); 
      file = serializer.Deserialize(reader) as RequestFile;      
     } 
    } 

    file.Name = filename;   
    return file; 
} 

Проблема заключается в том, когда несколько файлов, созданных в то же время, иногда он бросил исключение: System.IO.IOException: Процесс не может получить доступ к файл, потому что он используется другой ошибкой процесса.

Любые решения?

+0

показать, как/где вы создаете экземпляр «шкафчика» – loopedcode

+0

Почему бы вам не проверить, если файл находится в использовании, прежде чем вы попытаетесь прочитать его –

+0

, если это так, я думаю, что он должен делать с тем, когда и как вы называете этот метод, а не самим методом. Это звучит многопоточно. – DidIReallyWriteThat

ответ

0

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

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

static object _locker = new object(); 
+0

'locker' уже статический экземпляр определяет вне функции – hexacool

Смежные вопросы

 Смежные вопросы