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

問題は、UIスレッドでタスクを非同期的に実行するDispatcher.BeginInvokeを使用していることです。関数から戻るまでに、ビットマップが初期化されるという保証はありません。これをすぐに初期化する必要がある場合は、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 に答える