如何确定Dispatcher.BeginInvoke何时完成?

时间:2013-02-15 16:51:52

标签: silverlight

我有一个Silverlight 5应用程序,它使用ImageTools for SilverlightCanvas保存到PNG图像。我知道我需要在UI线程上使用Canvas并使用以下代码,这些代码有效:

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

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

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

问题是,如果Canvas非常大,那么BeginInvoke中的代码可能需要一段时间才能完成。由于它在UI线程上运行,因此在执行期间会冻结浏览器窗口。

用户选择保存导出图像的位置后,我想弹出一个告诉用户“请稍候......”的子窗口,然后运行上面张贴的图像保存代码,之后自动隐藏子窗口,但我没有太多运气实现它。

首先,BeginInvoke代码是异步运行的,所以我怎么知道它何时完成?

1 个答案:

答案 0 :(得分:1)

如果你需要在UI Thread上调用ToImage()很好,但这并不意味着你必须对图像进行编码。

这样的事情将确保用户界面保持响应。

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);
            });
        });
    }
}