在我的程序中,我有一组对象,我想延迟打印每个对象。
现在这是我的 Draw() 函数:
public void Draw()
{
myCanvas.Children.Clear();
foreach (Square Sq in MyDrawings)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
sq.Draw();
}));
}
}
我的 sq.draw() 函数,当前绘制一个矩形,并将其添加到 Canvas 中:
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 线程,当它解除阻塞时,整个 Array 已被绘制。
我也尝试过使用 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);
});
}
}
最佳答案
如果您只想遍历集合并一个接一个地启动异步/并行执行打印作业,您可以做类似的事情
foreach (Square Sq in MyDrawings)
{
Task.Run(() =>
{
sq.Draw();
Thread.Sleep(SOME_MILLISECONDS_TO_WAIT);
}));
}
这将在指定的 SOME_MILLISECONDS_TO_WAIT
毫秒数量上暂停迭代,并迭代集合中的另一个元素。
当然,如果您关心来自 Task
的反馈,或者想要尽可能多地控制 Task 的运行,您将需要在此代码中添加更多内容。
关于c# - 如何延迟我的打印功能以便我可以看到每个对象的打印时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43597529/