0

ImageTools for SilverlightCanvasを使用して PNG 画像に保存するSilverlight 5 アプリケーションがあります。CanvasUI スレッドで を操作する必要があり、次のコードが機能する必要があることを理解しています。

if (saveFileDialog.ShowDialog() == true)
{
    var stream = saveFileDialog.OpenFile();

    writeableBitmap.Dispatcher.BeginInvoke(delegate
    {
        ExtendedImage extendedImage = writeableBitmap.ToImage();

        new PngEncoder().Encode(extendedImage, stream);
    });
}

BeginInvoke問題は、Canvas が非常に大きい場合、 のコードが完了するまでにかなりの時間がかかることです。これは UI スレッドで実行されているため、実行中にブラウザ ウィンドウがフリーズします。

ユーザーがエクスポートされた画像を保存する場所を選択した後、「お待ちください...」とユーザーに通知する子ウィンドウをポップアップし、上記の画像保存コードを実行し、その後子を非表示にしますウィンドウが自動的に開きますが、それを達成するのはあまり運がありません。

まず、BeginInvoke コードは非同期で実行されるため、いつ完了したかを知るにはどうすればよいでしょうか?

4

1 に答える 1

1

UI スレッドで ToImage() を呼び出す必要がある場合は問題ありませんが、画像もエンコードする必要があるわけではありません。

このようなことにより、UI の応答性が維持されます。

if (saveFileDialog.ShowDialog() == true)
{
    using (var stream = saveFileDialog.OpenFile())
    {
        writeableBitmap.Dispatcher.BeginInvoke(delegate
        {
            ExtendedImage extendedImage = writeableBitmap.ToImage();
            System.Threading.ThreadPool.QueueUserWorkItem(item =>
            {
                new PngEncoder().Encode(extendedImage, stream);
            });
        });
    }
}
于 2013-02-15T18:19:21.367 に答える