2014-09-02 3 views
0

FileSystemWatcher 파일 생성 이벤트 내에 다음 코드가 있습니다. 파일이 만들어 질 때마다 그래서, 아래의 코드를 실행합니다 :XmlReader.Create get "프로세스가 다른 프로세스에서 사용 중이므로 파일에 액세스 할 수 없습니다."오류

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

관련 문제