在我的程序中,我有一个对象数组,我想一次一个地打印每个对象。
现在这是我的Draw()函数:
public void Draw()
{
myCanvas.Children.Clear();
foreach (Square Sq in MyDrawings)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
sq.Draw();
}));
}
}
我的sq.draw()函数,当前绘制一个矩形,并将其添加到画布:
rect = new Rectangle
{
Stroke = Brushes.Black,
StrokeThickness = 0.5,
Fill = Brushes.Black,
Height = Width,
Width = Width
};
Canvas.SetTop(rect, x * Width);
Canvas.SetLeft(rect, y * Width);
Form.myCanvas.Children.Add(rect);
我尝试过添加一个Thread.Sleep();在主要的Draw()函数中,但它似乎阻止了UI线程,当它解除阻塞时,整个数组已被绘制。
我也尝试过使用DispatcherTimer,但我不知道要添加什么延迟,因为我想打印每个对象,而不是基于时间。
固定代码:
public void Draw()
{
myCanvas.Children.Clear();
foreach (Square Sq in MyDrawings)
{
Task.Run(() =>
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
sq.Draw();
}));
Thread.Sleep(100);
});
}
}
答案 0 :(得分:0)
如果您只想迭代收集并一个接一个地启动打印作业的异步/并行执行,您可以执行类似
的操作 foreach (Square Sq in MyDrawings)
{
Task.Run(() =>
{
sq.Draw();
Thread.Sleep(SOME_MILLISECONDS_TO_WAIT);
}));
}
这将暂停指定的SOME_MILLISECONDS_TO_WAIT
ms量的迭代,并迭代集合中的另一个元素。
当然,如果您关注来自Task
的反馈,或者想要尽可能多地控制任务的运行,您将需要为此代码添加更多内容。