【问题标题】:Cancel long running render operation in WPF取消 WPF 中长时间运行的渲染操作
【发布时间】:2025-12-23 20:10:06
【问题描述】:

有什么方法可以取消 WPF 中可能长时间运行的渲染操作? 就我而言,我想将复杂的控件(在非 UI 线程中)渲染到位图。

var bitmap = new RenderTargetBitmap((int)RenderSize.Width, (int)RenderSize.Height, 96, 96, PixelFormats.Default);
bitmap.Render(visual);    //May take several seconds, but the result may be obsolete

如果目标的大小或其他一些属性发生变化,则当前绘制的位图已过时 - 因此我想尽快停止渲染。

【问题讨论】:

  • 异步/等待没有帮助?
  • 我的问题不在于我在等待结果,而是该操作非常占用处理器资源,因此如果我在每次更改时都启动一个新任务/线程,这些操作将总结起来。
  • RenderTargetBitmap 显然没有支持取消的 API。
  • 这能回答你的问题吗? Asynchronously render a WPF visual to a bitmap
  • 看起来很有希望,但我还没有让它工作。尝试渲染不在可视化树中的 UIElement 时抛出 InvalidOperationException(“未连接到 PresentationSource”)

标签: wpf cancellation rendertargetbitmap


【解决方案1】:

有什么方法可以取消 WPF 中可能长时间运行的渲染操作?

简短回答:不。

您无法取消不支持取消的 API。

RenderTargetBitmap.Render 等同步 API 在完成或抛出异常之前不会返回。恐怕你打电话后不能“取消”它。

根据使用位图的方式和位置,您可以考虑在后台线程上渲染它。

【讨论】:

  • 好的。如果时间太长,我想我会将渲染分成多个部分并单独渲染。