在我的WPF应用程序中,我有一个for
循环,在单击按钮后操作Canvas
控件。
for (var i = 0; i < numOfIterations; i++)
{
swarm.iterate();
myCanvas.Children.Clear();
for (int j = 0; j < numCities - 1; j++)
{
Line line = new Line();
line.Stroke = System.Windows.Media.Brushes.Black;
line.X1 = ScaleX(cities[swarm._gbestlist[j]].x, maxX);
line.X2 = ScaleX(cities[swarm._gbestlist[j + 1]].x, maxX);
line.Y1 = ScaleY(cities[swarm._gbestlist[j]].y, maxY);
line.Y2 = ScaleY(cities[swarm._gbestlist[j + 1]].y, maxY);
line.StrokeThickness = 2;
myCanvas.Children.Add(line);
}
}
正如您可能知道的那样,UI在循环执行期间没有响应,循环结束后,最后一次迭代后的结果是可见的。我该怎么做才能拥有一个&#34; live&#34;预览要添加和删除的行?
我尝试使用BackgroundWorker
:
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
double maxX = FindMaxX();
double maxY = FindMaxY();
for (int i = 0; i < 250; i++)
{
swarm.iterate();
RemoveLines();
for (int j = 0; j < cities.Count - 1; j++)
{
Line line = new Line();
line.Stroke = System.Windows.Media.Brushes.Black;
line.X1 = ScaleX(cities[swarm._gbestlist[j]].x, maxX);
line.X2 = ScaleX(cities[swarm._gbestlist[j + 1]].x, maxX);
line.Y1 = ScaleY(cities[swarm._gbestlist[j]].y, maxY);
line.Y2 = ScaleY(cities[swarm._gbestlist[j + 1]].y, maxY);
line.StrokeThickness = 2;
myCanvas.Children.Add(line);
}
}
}
但是我得到了
System.InvalidOperationException未被用户代码处理: 调用线程无法访问此对象,因为不同的线程 拥有它。
答案 0 :(得分:0)
您仍然可以使用应用程序调度程序异步执行此操作。此外,如果使用Sinatr建议的计时器将迭代拆分为步骤,则可以获得所需的效果。
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,new
Action(DoWork)
希望它有所帮助。