簡體   English   中英

thread.sleep在C#圖形中無法正常工作

[英]thread.sleep doesn't work correctly in C# graphics

我想繪制一個像素,然后在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);

    }

這是因為您正在同一UI線程中睡眠。 您需要使用另一個線程來等待並回調UI來繪制另一個像素,依此類推。

最簡單的方法是使用WinForms Timer。

您可以使用異步/等待不阻止您的用戶界面

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);

}

那是因為所有這些都發生在同一個線程上,當您調用Thread.Sleep您會休眠該線程,這樣UI不會有更新的機會,因此繪制全部一次發生。 嘗試延遲另一個線程上的第二個點,然后繪制它

bmp.SetPixel(15, 15, Color.Red);
Task.Delay(5000).ContinueWith(t => 
{
    bmp.SetPixel(17, 17, Color.Red);
}, TaskScheduler.FromCurrentSynchronizationContext());

幾點評論:

  • 您正在創建圖形對象,但不對其執行任何操作。
  • 當您調用Thread.Sleep時,您正在休眠該線程,它也負責繪制您的UI。 這就是兩個像素同時彈出的原因。

如果您希望將對位圖的更改“實時”呈現回winforms UI,則您還有很多工作要做。

就像是:

  • 創建線程以管理對位圖的更新
  • 創建從該線程回到UI線程的信號機制,其中有很多有趣的東西需要繪制
  • 在更新操作期間同步對位圖的訪問,並在UI線程上封送調用

沒有更多關於您實際要完成的工作的信息,除了這里已發布的內容和其他答案外,沒有太多其他建議可給您

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM