【发布时间】:2013-03-13 11:00:56
【问题描述】:
我的应用程序 (migradoc) 中有一个 PDF 导出文件。为了避免冻结 GUI,我想将此导出作为单独的线程运行。 PDF 还嵌入了图表。为了使这些图表看起来像我在应用程序中使用的图表,我在代码中创建和呈现它们。 (视火) 我的线程已经是 STA,但是在运行 WPF 渲染命令时出现异常:
调用线程无法访问此对象,因为不同的线程拥有它
我的代码:
chart.Measure(new Size(311, 180));
chart.Arrange(new Rect(0, 0, 311, 180));
chart.UpdateLayout();
ExportToPng(new Uri("C:\\" + i + "c.png"), chart);
public void ExportToPng(Uri path, Chart surface)
{
if (path == null) return;
// Save current canvas transform
Transform transform = surface.LayoutTransform;
// reset current transform (in case it is scaled or rotated)
surface.LayoutTransform = null;
// Create a render bitmap and push the surface to it
var renderBitmap =
new RenderTargetBitmap(
(int) surface.Width,
(int) surface.Height,
96d,
96d,
PixelFormats.Pbgra32);
renderBitmap.Render(surface);
// Create a file stream for saving image
using (var outStream = new FileStream(path.LocalPath, FileMode.Create))
{
// Use png encoder for our data
var encoder = new PngBitmapEncoder();
// push the rendered bitmap to it
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
// save the data to the stream
encoder.Save(outStream);
}
// Restore previously saved layout
surface.LayoutTransform = transform;
}
我已经尝试发送此命令,但我仍然收到相同的错误。
DispatcherHelper.UIDispatcher.BeginInvoke((Action)(() =>
{
chart.Measure(new Size(311, 180));
chart.Arrange(new Rect(0, 0, 311, 180));
chart.UpdateLayout();
ExportToPng(new Uri("C:\\" + i + "c.png"), chart);
}));
【问题讨论】:
-
AFAIK 您只能在 GUI 线程上渲染 GUI,而不能在其他线程上渲染。
-
我知道我已经尝试发送它,但我仍然得到同样的错误(见编辑)
-
您的 UI 线程是否创建图表对象?您只能从创建它们的同一线程更新 WPF 对象。因此,如果您从另一个线程创建图表,则对该图表对象的任何更新也需要在该特定的其他线程上。
标签: c# wpf multithreading visifire