C# 在多个线程之间流式处理可写位图
本文关键字:处理 位图 之间 线程 | 更新日期: 2023-09-27 17:56:16
我已经搜索了一段时间关于这个问题。有一些解决方案,但没有一个能解决我的问题。场景是,我正在后台线程中获取和处理位图流,并且在每个帧准备就绪后,我正在尝试在 MainWindow 中更新位图。我在此处粘贴关键代码片段以解释该场景。
UI Thread/MainWindow.xaml.cs
object lockObject = ThreadLockProvider.sharedInstance.LockObject;
lock (lockObject)
{
WriteableBitmap imageFromBackgroundThread = this.webserver.getForegroundBitmap().Clone();
this.newImage = new WriteableBitmap(imageFromBackgroundThread );
this.IconImage.Source = this.newImage;
}
背景线程/图像处理器.cs
object lockObject = ThreadLockProvider.sharedInstance.LockObject;
lock (lockObject)
{
// do the image processing tasks with this.foregroundBitmap
}
当我执行代码时,我在主线程中收到错误 - "调用线程无法访问此对象,因为其他线程拥有它。想不通为什么。谁能帮我解决问题?我已经通过这个链接了-
在线程之间锁定图像时出现问题
C# 线程位图对象/图片框
具有多个线程时的可写位图异常
谢谢。
在 UI 线程中使用位图之前,必须调用Freeze
。并且您只能通过其调度程序访问图像控件:
newImage = new WriteableBitmap(imageFromBackgroundThread);
newImage.Freeze();
IconImage.Dispatcher.Invoke(new Action(() => IconImage.Source = newImage));
尝试替换此行
this.IconImage.Source = this.newImage;
使用以下代码
Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(delegate()
{
this.IconImage.Source = this.newImage;
}));
尝试像这样更新 UI 对象:
Application.Current.Dispatcher.Invoke(() => {//Update UI ojects here});