【问题标题】:How to delay my printing function so I can see when each object is printed如何延迟我的打印功能,以便我可以看到每个对象的打印时间
【发布时间】:2017-04-25 06:12:53
【问题描述】:

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

现在这是我的 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 线程,当它解除阻塞时,整个 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);
            });
        }
    }

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经用你建议的代码编辑了我的主帖,我必须包含调度程序,否则 UI 线程会阻塞。使用您的建议后,我的程序仍然无法正确打印代码,我什至使用秒表来测量该方法的执行时间,它是 83 毫秒,尽管我在每个循环之间添加了 100 毫秒的等待时间
    • @BaronSensei:“正确”是什么意思?难道你不希望程序向打印机发送一个打印作业,稍等片刻再发送另一个,即使之前还没有完成?
    • 对不起,我不是更清楚,我打算我的程序:打印对象->等待〜50-100ms->打印对象->...但是我以前的实现和你的,它会等待
    • 效果很好,谢谢!似乎我之前使用 Thread.Sleep() 的实现是错误的,因为我将它放在调度程序调用中,并且它冻结了整个 UI 直到完成,当我将它放在 Invoke 之外时它工作得很好。
    • @BaronSensei:很可能你把Sleep放在辅助线程之外,所以它阻塞了主线程。
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多