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# 线程位图对象/图片框

具有多个线程时的可写位图异常

谢谢。

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});