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