【问题标题】:c# WPF UI freeze after using MemoryStreamc# WPF UI 在使用 MemoryStream 后冻结
【发布时间】:2013-10-26 20:04:45
【问题描述】:

这段代码有点问题:

private Bitmap WriteableBitmapToBitmap(WriteableBitmap wb)
{
     BitmapEncoder encoder = new BmpBitmapEncoder();
     encoder.Frames.Add(BitmapFrame.Create(wb));
     using (MemoryStream ms = new MemoryStream())
     {
         encoder.Save(ms);
         Bitmap b = new Bitmap(ms);
         return b;
      }
}

如果我启动此代码,WPF UI 会冻结。我只想将 WriteableBitmap 转换为 Bitmap,以便可以将其用于 Emgu 图片处理。 WriteableBitmap 是从 Kinect 的深度数据创建的。我是编程新手,所以肯定有更好的方法,但我希望这也能奏效。

任何人都可以帮助我编写该代码吗?

【问题讨论】:

  • 如果 UI 卡住了这并不意味着代码错误,这意味着您不应该在 UI 线程中执行它;您应该在非 UI 线程中进行长时间运行的 UI 工作。关于如何将工作卸载到非 UI 线程的参考文献有上百万条。
  • 好的,谢谢,我去看看。
  • 冻结不会是我所期望的典型结果。但是代码肯定是错误的,只要 Bitmap 对象是生命,您就不能处置 MemoryStream。它需要稍后能够访问流。删除 using 语句。
  • Servy 是对的,这是 UI 线程的问题,我用异步解决方案解决了它,现在它可以工作了。谢谢。

标签: c# kinect freeze memorystream


【解决方案1】:

有点晚了,但我想补充一些更多信息。

问题是您正在使用一个使用 UI 线程的同步调用,与所有其他同步调用不同,此调用需要一些时间,因此,您的应用程序会被冻结,直到调用完成。

您需要使用异步调用,这样您的 UI 线程将是空闲的,因此 UI 不会被冻结。

异步调用的方式有很多,比如开启一个新的任务,线程,或者我比较喜欢的方式,就是使用async await,非常棒——可以写个同步代码,加上async并在正确的地方等待,然后哇——这是一个异步代码!

要了解更多关于异步等待的信息,请点击here

【讨论】:

    猜你喜欢
    • 2015-01-16
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多