无法在单独的任务中创建BItmapImage

本文关键字:创建 BItmapImage 任务 单独 | 更新日期: 2023-09-27 18:23:37

我正在为WP8(Lumia 920)开发成像应用程序。我在xaml层中使用C#进行编码。

我在尝试在一个单独的任务中创建一个新的BitmapImage对象时遇到了问题,该任务预计会使用相机应用程序生成的帧。

这是我的代码的简化版本:

public void ProcessFrames(){
    while (true)
    {
        dataSemaphore.WaitOne();
        if (nFrameCount>0)
        {
            MemoryStream ms = new MemoryStream(previewBuffer1);
            BitmapImage biImg = new BitmapImage();  // *******THROWS AN ERROR AT THIS LINE ********
            biImg.SetSource(ms);
            ImageSource imgSrc = biImg as ImageSource;
            capturedFrame.Source = imgSrc;
        }
    }
}
public MainPage()
{
    InitializeComponent();
    T1 = new Thread(ProcessFrames);
    T1.Start();
}

现在,令人惊讶的是,如果我在一个主要函数中做了同样的事情,例如:,我在"new BitmapImage()"中没有得到错误

public MainPage()
{
    InitializeComponent();
    BitmapImage biImg = new BitmapImage();    // ****** NO ERROR ***********
    T1 = new Thread(ProcessFrames);
    T1.Start();
}

有人能帮我理解这种行为的原因吗。我的要求是能够使用预览缓冲区(previewBuffer1)并在其中一个图像帧中显示它。这需要我在单独的任务中创建一个新的BitmapImage。

无法在单独的任务中创建BItmapImage

只有UI线程可以实例化BitmapImage

您应该尝试Deployment.Current.Dispatcher.BeginInvoke方法:

public void ProcessFrames(){
    while (true)
    {
        dataSemaphore.WaitOne();
        if (nFrameCount>0)
        {
            MemoryStream ms = new MemoryStream(previewBuffer1);
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                BitmapImage biImg = new BitmapImage();
                biImg.SetSource(ms);
                ImageSource imgSrc = biImg as ImageSource;
                capturedFrame.Source = imgSrc;
            });
        }
    }
}