PictureBox Invalidate 花了太多时间

PictureBox Invalidate took too much time

我不知道,为什么 invalidate 需要那么多时间。我写了基本的程序,但我不知道如何修复,才能顺利工作。

while (_continue)
{
  try
  {
    string message = port.ReadLine();
    Console.WriteLine("message");
    pictureBox1.Invalidate();
  }
  catch (TimeoutException) {
  }
}

绘画函数是:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Console.WriteLine("hi");
}

我在没有控制台写入的情况下更改代码并且工作相同或可能最差。

结果类似于:100x "message" 1x "hi"、1x "message" 1x "hi" 类似于 100x "message"。我需要更频繁地使用油漆。

我认为您的 Paint 方法很少被调用,因为您的循环阻塞了 UI 线程。您应该考虑使此代码异步。这是一个如何做到这一点的例子:

public async Task ReadMessages()
{
    while (_continue)
    {
        try
        {
            string message = await Task.Run(() => port.ReadLine());
            Console.WriteLine("message");
            pictureBox1.Invalidate();
        }
        catch (TimeoutException) {    }
    }
}

所以这个方法returns让调用者在等待来自port的数据时。当 Task 执行 port.ReadLine() 完成时,此方法在 Console.WriteLine 处继续执行并使 pictureBox1.

无效

然后循环,启动另一个任务从端口读取并在等待数据的同时returns再次控制给调用者。

这样你就不会阻塞 UI 线程并且 pictureBox1 有时间自己绘制。