【发布时间】:2015-10-24 04:44:49
【问题描述】:
我在使用 Parallel.Foreach 或 IEnumerable.AsParallel().ForAll() 或 Threads 更新 Canvas 的内容时遇到了一些问题。
我在 Canvas 中有很多线条,当用户调整窗口大小时,我需要将它们的坐标相对于它们所在的 Canvas 的新大小进行更改。
我把我的线放进去
IEnumerable<Line> lineCollection = canvas.Children.OfType<Line>();
然后我尝试使用 Parallel.Foreach 或 IEnumerable.AsParallel().ForAll() 将它们并行循环
在这种情况下,我会收到 AggregateException。它说,调用线程不能访问这个对象,因为主线程拥有它。
如何使用我的 UIElements 做到这一点。
这是我的代码:
private void canvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
Double hDelta = e.NewSize.Height / e.PreviousSize.Height;
if (Double.IsInfinity(hDelta)) return;
IEnumerable<Line> LineCollection = canvas.Children.OfType<Line>();
try
{
Parallel.ForEach(LineCollection, (line) =>
{
Double topProp = (Double)line.GetValue(Canvas.TopProperty) * hDelta;
line.SetValue(Canvas.TopProperty, topProp);
});
}
catch (AggregateException ae)
{
ae.Handle((x) =>
{
if (x is Exception)
{
MessageBox.Show(x.ToString(), "error");
}
return false;
});
}
}
我在这一行收到一个错误:
line.SetValue(Canvas.TopProperty, topProp);
【问题讨论】:
-
你不能。只有主线程可以访问 UI 对象。
-
也许这会回答你的问题并给你一个解决方案:stackoverflow.com/questions/9980053/…
-
你实际画了多少线?你的方法似乎有点矫枉过正。
-
几千行。我必须使用什么方法?
标签: c# wpf multithreading canvas parallel.foreach