2016-08-28 8 views
0

이미지 파일을 Paint에서 편집 할 때 FileSystemWatcher를 사용하여 이벤트를 발생시키고이를 사용하여 미리보기 이미지 컨트롤을 업데이트합니다. 그러나 파일을 소스로 두 번째로 설정하면 파일이 다른 프로세스에서 계속 사용되고 있기 때문에 오류가 발생합니다. 그래서 이것이 FileSystemWatcher 때문이라는 것을 알게되었습니다. 나는 Image 제어를 업데이트하기 전에 파일을 해제하려면이 코드에서FileSystemWatcher가 파일을 잠글 때 해제하는 방법은 무엇입니까?

private void btnEdit_Click(object sender, RoutedEventArgs e) 
    { 
     if (!File.Exists(lastImage)) return; 
     FileSystemWatcher izleyici = new FileSystemWatcher(System.IO.Path.GetDirectoryName(lastImage), 
      System.IO.Path.GetFileName(lastImage)); 
     izleyici.Changed += izleyici_Changed; 
     izleyici.NotifyFilter = NotifyFilters.LastWrite; 
     izleyici.EnableRaisingEvents = true; 
     ProcessStartInfo info = new ProcessStartInfo(); 
     info.FileName = lastImage; 
     info.Verb = "edit"; 
     Process.Start(info); 
    } 

    void izleyici_Changed(object sender, FileSystemEventArgs e) 
    { 
     //I want to add code here to release the file. Dispose() not worked for me 

     setImageSource(lastImage); 
    } 

    void setImageSource(string file) 
    { 
     var bitmap = new BitmapImage(); 

     using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read)) 
     { 
      bitmap.BeginInit(); 
      bitmap.CacheOption = BitmapCacheOption.OnLoad; 
      bitmap.StreamSource = stream; 
      bitmap.EndInit(); 
     } 

     ssPreview.Source = bitmap; 
    } 

:

나는이 코드를 가지고있다. 나는 Dispose을 시도했지만 제대로 작동하지 않았습니다. 어떻게해야합니까?

답변

1

파일은 FileSystemWatcher 또는 MS 그림판에 의해 잠겨 있지 않습니다. 실제로 발생한 일은 InvalidOperationException이됩니다. FileSystemWatcher의 Changed 이벤트가 UI 스레드에서 발생하지 않으므로 처리기 메서드가 Image 컨트롤의 Source 속성을 설정할 수 없기 때문입니다. 디스패처 행동에 이미지 로딩 코드를 호출

문제 해결 :

void setImageSource(string file) 
{ 
    Dispatcher.Invoke(new Action(() => 
    { 
     using (var stream = new FileStream(
           file, FileMode.Open, FileAccess.Read, FileShare.Read)) 
     { 
      ssPreview.Source = BitmapFrame.Create(
       stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
     } 
    })); 
} 
+0

감사합니다, 그것은했다. 하지만 UI 스레드에서 해고 당하지 않는다는 것은 무엇을 의미합니까? 논리를 얻으려면 더 자세한 설명을 해 주시겠습니까? 그것은 나를 위해 중요합니다. 다시 한번 감사드립니다. –

+1

[Dispatcher] (https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher (v = vs.110) .aspx) 클래스의 온라인 설명서를 읽을 수 있습니다. – Clemens

관련 문제