thread.sleep在C#图形中无法正常工作

时间:2014-02-24 14:47:56

标签: c# delay

我想绘制一个像素,并在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);

    }

4 个答案:

答案 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)

几条评论:

  • 您正在创建一个图形对象,但没有对它做任何事情。
  • 当您调用Thread.Sleep时,您正在睡眠线程,该线程还负责绘制您的UI。这就是为什么两个像素同时弹出的原因。

如果您正在寻找将位图更改“实时”渲染回winforms UI,那么您还有很多工作要做。

类似的东西:

  • 创建线程以管理位图的更新
  • 从该线程创建信号机制,回到UI线程,有一些有趣的东西要绘制
  • 在更新操作期间同步对位图的访问并将调用编组到UI线程

如果没有更多关于你实际想要完成什么的信息,那么除了在这里和其他答案中发布的内容之外,没有太多建议给你提供