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
有时间自己绘制。
我不知道,为什么 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
有时间自己绘制。