2

我正在尝试在后台线程(BackgroundWorker)中创建一个 BitmapImage,但我的函数只返回一次 null 并且不进入 Deployment.Current.Dispatcher.BeginInvoke。当我在 UI 线程中使用此功能时,一切都很好。文件路径正确(为.jpg图片)

public static BitmapImage convertFileToBitmapImage(string filePath)
{
    BitmapImage bmp = null;
    Uri jpegUri = new Uri(filePath, UriKind.Relative);
    StreamResourceInfo sri = Application.GetResourceStream(jpegUri);

    Deployment.Current.Dispatcher.BeginInvoke(new Action(  ( ) =>
        {

            bmp = new BitmapImage();
            bmp.SetSource(sri.Stream);

        }));
    return bmp;
}
4

1 回答 1

4

问题是您使用Dispatcher.BeginInvoke它将在 UI 线程上异步运行任务,无法保证在您从函数返回时位图将被初始化。如果您需要立即对其进行初始化,您应该使用Dispatcher.Invoke以便这一切同步发生。

更新

错过了你的标签,因为它是 Windows Phone,但是,同样的问题仍然存在,你没有给你的应用足够的时间来初始化位图。您也许可以使用AutoResetEvent等待在从方法返回之前创建位图,例如

public static BitmapImage convertFileToBitmapImage(string filePath)
{
    BitmapImage bmp = null;
    Uri jpegUri = new Uri(filePath, UriKind.Relative);
    StreamResourceInfo sri = Application.GetResourceStream(jpegUri);
    AutoResetEvent bitmapInitializationEvt = new AutoResetEvent(false);
    Deployment.Current.Dispatcher.BeginInvoke(new Action(() => {
        bmp = new BitmapImage();
        bmp.SetSource(sri.Stream);
        bitmapInitializationEvt.Set();
    }));
    bitmapInitializationEvt.WaitOne();
    return bmp;
}
于 2012-08-22T08:10:58.980 回答