3 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
這不起作用的原因是因?yàn)?Thread.Sleep() 正在阻止線(xiàn)程完成。
僅當(dāng)應(yīng)用程序不執(zhí)行任何操作時(shí),即在您的方法完成后,才會(huì)重繪窗口。如果您刪除更改它的行,DarkGreen您將看到它在五秒鐘后改變顏色。
您應(yīng)該使用計(jì)時(shí)器來(lái)解決您的問(wèn)題。
如果您愿意,您可以強(qiáng)制它提前刷新界面,而無(wú)需通過(guò)調(diào)用Application.DoEvents();將反映您所做的更改(例如顏色更改)離開(kāi)該方法。
button1.BackColor = Color.Lime;
Application.DoEvents()
Thread.Sleep(5000);
button1.BackColor = Color.DarkGreen;
請(qǐng)注意,在具有用戶(hù)界面的程序中放置線(xiàn)程睡眠是一個(gè)壞主意,但出于說(shuō)明目的,它將向您展示如何使其改變顏色。

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
您的問(wèn)題是因?yàn)?UI 線(xiàn)程被阻止。您需要在單獨(dú)的線(xiàn)程中運(yùn)行此邏輯。試試這個(gè)代碼:
private async void button1_Click(object sender, EventArgs e)
{
button1.BackColor = Color.LimeGreen;
await Task.Run(() =>
{
System.Threading.Thread.Sleep(5000);
button1.BackColor = Color.DarkGreen;
});
}
這會(huì)將您的按鈕變?yōu)長(zhǎng)imeGreen,然后等待 5 秒鐘再將其變?yōu)镈arkGreen。這是有效的,因?yàn)槲覀冊(cè)谝粋€(gè)新線(xiàn)程中旋轉(zhuǎn)它,因此不會(huì)鎖定 UI。

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
我不推薦使用 Thread.Sleep() 因?yàn)樗鼤?huì)凍結(jié)你的界面。您還需要刷新按鈕以顯示更改。您可以使用 async 和 wait 方法來(lái)延遲按鈕顏色更改 在 button1_click 函數(shù)的 private 關(guān)鍵字之后添加 async 并創(chuàng)建 async Task 函數(shù)并使用 await awaiting() 刪除 Thread.Sleep() 函數(shù);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
button1.BackColor = Color.Lime;
button1.Refresh();
await awaiting();
button1.BackColor = Color.DarkGreen;
}
private async Task awaiting() {
await Task.Delay(5000);
}
}
- 3 回答
- 0 關(guān)注
- 140 瀏覽
添加回答
舉報(bào)