[英]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());
幾點評論:
如果您希望將對位圖的更改“實時”呈現回winforms UI,則您還有很多工作要做。
就像是:
沒有更多關於您實際要完成的工作的信息,除了這里已發布的內容和其他答案外,沒有太多其他建議可給您
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.