2016-08-28 12 views
0

イメージファイルをペイントで編集したときにFileSystemWatcherを使用してイベントを発生させ、それを使用してプレビューイメージコントロールを更新しています。しかし、ファイルをソースとして2回目に設定すると、ファイルが別のプロセスによってまだ使用されているため、エラーがスローされます。だから私はこれが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 Paintによってもロックされません。実際には、FileSystemWatcherのChangedイベントがUIスレッドで発生しないため、ハンドラメソッドはImageコントロールのSourceプロパティを設定できないため、InvalidOperationExceptionが返されます。問題を解決ディスパッチャアクションで画像の読み込みコードを呼び出す

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

関連する問題