我想绘制一个像素,并在5秒后绘制另一个像素。但在此代码中,单击按钮后,需要5秒钟,同时绘制两个像素。这意味着首先运行thread.sleep和然后设置像素。如何解决?
private void button1_Click(object sender, EventArgs e)
{
Graphics g = panel1.CreateGraphics();
Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
panel1.BackgroundImage = (Image)bmp;
panel1.BackgroundImageLayout = ImageLayout.None;
bmp.SetPixel(15, 15, Color.Red);
System.Threading.Thread.Sleep(5000);
bmp.SetPixel(17, 17, Color.Red);
}
答案 0 :(得分:1)
这是因为你在同一个UI线程中睡觉。您需要使用另一个线程来等待并回调UI以绘制另一个像素,等等。
最简单的方法是使用WinForms Timer。
答案 1 :(得分:1)
您可以使用async / await来阻止您的UI
private async void button1_Click(object sender, EventArgs e)
{
Graphics g = panel1.CreateGraphics();
Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
panel1.BackgroundImage = (Image)bmp;
panel1.BackgroundImageLayout = ImageLayout.None;
bmp.SetPixel(15, 15, Color.Red);
await Task.Delay(5000); // <---
bmp.SetPixel(17, 17, Color.Red);
}
答案 2 :(得分:1)
那是因为它全部发生在同一个线程上,当你调用Thread.Sleep
时你会让线程休眠,因此UI没有机会更新,因此绘图都会立即发生。尝试在另一个线程上延迟第二个点,然后绘制它
bmp.SetPixel(15, 15, Color.Red);
Task.Delay(5000).ContinueWith(t =>
{
bmp.SetPixel(17, 17, Color.Red);
}, TaskScheduler.FromCurrentSynchronizationContext());
答案 3 :(得分:1)
几条评论:
如果您正在寻找将位图更改“实时”渲染回winforms UI,那么您还有很多工作要做。
类似的东西:
如果没有更多关于你实际想要完成什么的信息,那么除了在这里和其他答案中发布的内容之外,没有太多建议给你提供