我通过将 WPF 控件放在网格上然后将其保存到文件来创建图像。我从不展示网格。效果很好。
但是当我尝试将其放入
Task
和 Task.Run
中时,它失败了:
调用线程必须是STA,因为很多UI组件都需要这个
由于我从未显示网格,是否可以通过某种简单的方式来规避此错误,而无需为任务创建单独的线程?我不能在真正的 UI 线程上使用它,这是这里的要求。
WPF 本身对于多线程来说并不安全,除非是非常特殊且有文档记录的类。 WPF 只能在具有发送消息的调度程序的 STA 线程中使用。不过,每个进程可以有多个 STA 线程和调度程序。
例如,您可能有一个或多个仅渲染图像的后台线程。每个您都将从标记
Thread.SetApartmentState(ApartmentState.STA)
开始,通过访问后台线程上的 Dispatcher.CurrentDispatcher
创建调度程序,并使用 Dispatcher.Run()
发送消息。可以使用 Dispatcher.BeginInvoke
编组工作,并且可以通过调用 Dispatcher.ExitAllFrames()
结束线程。