У меня есть некоторые проблемы с обновлением содержимого Canvas с использованием Parallel.Foreach или IEnumerable.AsParallel(). ForAll() или Threads.Обновление WPF UIElements с использованием Parallel.Foreach или Threads
У меня есть много линий в холсте, и мне нужно изменить их координаты относительно нового размера холста, в котором они находятся, когда пользователь изменяет размер окна.
Я кладу линии в
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);
Вы не можете. Только основной поток может получить доступ к объекту пользовательского интерфейса. – Paparazzi
Возможно, это ответит на ваш вопрос и даст вам решение: http://stackoverflow.com/questions/9980053/dispatcher-dispatch-on-the-ui-thread –
Сколько строк вы на самом деле рисуете? Ваш подход кажется излишним. – Clemens