C# WPF FileWatcher更新映像。源线程冲突

C# WPF FileWatcher更新映像。源线程冲突,c#,wpf,multithreading,xaml,C#,Wpf,Multithreading,Xaml,我想在文件更改时更新wpf中的图像。我的问题是,我得到一个错误,说图像对象属于其他线程,所以我不能编辑Image.Source。我希望在filewatcher事件触发时更改映像。我该怎么做 我有这样的想法: C#1类: .xaml WPF uiClass: Image x:Name="Image" .cs WPF uiClass: public void UpdateImage(BufferedImage img) { this.Image.Source = img; }

我想在文件更改时更新wpf中的图像。我的问题是,我得到一个错误,说图像对象属于其他线程,所以我不能编辑Image.Source。我希望在filewatcher事件触发时更改映像。我该怎么做

我有这样的想法:

C#1类:

.xaml WPF uiClass:

 Image x:Name="Image" 
.cs WPF uiClass:

public void UpdateImage(BufferedImage img) 
{ 
    this.Image.Source = img; 
}

注释:fileSystemWatcher按预期工作。

您的
FileWatcher
事件(
FileWatcher\u Changed
)在后台线程上触发,您尝试从中更新映像的
源属性(通过调用
UpdateImage
)。此操作失败并出现错误,因为(简单地说)只能从UI线程更新
Image
控件

正如@ALOISG在注释中所述,您可以使用dispatcher的
BeginInvoke
方法将工作从后台线程转移到UI线程:

public void UpdateImage(BufferedImage img) 
{ 
    Action updateImage = () => { this.Image.Source = img };
    Dispatcher.BeginInvoke(updateImage);
}
另一种方法是拥有一个表示图像源的属性(在
窗口或ViewModel上),并从XAML绑定到该属性。那么,无论您是从后台线程还是从UI线程更改该属性都无关紧要


为您的
buffereImage
类发布源代码可能是值得的。目前,您正试图将
buffereImage
的一个实例分配给
映像。Source
属性:我怀疑即使线程问题得到解决,也无法按您的预期工作。

Dispatcher.BeginInvoke()?工作得很好!非常感谢你明确而严肃的回答!:你为我节省了很多时间,而且你的答案很容易理解D
public void UpdateImage(BufferedImage img) 
{ 
    Action updateImage = () => { this.Image.Source = img };
    Dispatcher.BeginInvoke(updateImage);
}