如何延迟我的打印功能,以便我可以看到每个对象的打印时间

时间:2017-04-24 20:53:09

标签: c# wpf

在我的程序中,我有一个对象数组,我想一次一个地打印每个对象。

现在这是我的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);
            });
        }
    }

1 个答案:

答案 0 :(得分:0)

如果您只想迭代收集并一个接一个地启动打印作业的异步/并行执行,您可以执行类似

的操作
    foreach (Square Sq in MyDrawings)
    {
        Task.Run(() =>
        {
            sq.Draw();
            Thread.Sleep(SOME_MILLISECONDS_TO_WAIT);
        }));
    }

这将暂停指定的SOME_MILLISECONDS_TO_WAIT ms量的迭代,并迭代集合中的另一个元素。 当然,如果您关注来自Task的反馈,或者想要尽可能多地控制任务的运行,您将需要为此代码添加更多内容。