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

Silverlight 如何确定Dispatcher.BeginInvoke何时完成?,silverlight,Silverlight,我有一个Silverlight 5应用程序,用于将画布保存为PNG图像。我知道我需要在UI线程上使用Canvas,并使用以下代码: if (saveFileDialog.ShowDialog() == true) { var stream = saveFileDialog.OpenFile(); writeableBitmap.Dispatcher.BeginInvoke(delegate { ExtendedImage extendedImage =

我有一个Silverlight 5应用程序,用于将
画布
保存为PNG图像。我知道我需要在UI线程上使用
Canvas
,并使用以下代码:

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

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

        new PngEncoder().Encode(extendedImage, stream);
    });
}
问题是,如果画布非常大,则
BeginInvoke
中的代码可能需要相当长的时间才能完成。因为它是在UI线程上运行的,所以在执行期间会冻结浏览器窗口

在用户选择保存导出图像的位置后,我想弹出一些子窗口,告诉用户“请稍候…”,然后运行上面发布的图像保存代码,然后自动隐藏子窗口,但我不太可能做到这一点


对于初学者来说,BeginInvoke代码是异步运行的,那么我如何知道它何时完成呢?

如果您需要在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);
            });
        });
    }
}