public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
button1.BackColor = Color.Lime;
Thread.Sleep(5000);
button1.BackColor = Color.DarkGreen;
}
}
button1已经是深绿色。当我单击button1时,什么都没有改变。
如何在5秒钟内观察到这种变化?
答案 0 :(得分:2)
之所以不起作用,是因为Thread.Sleep()阻止了线程的完成。
仅当应用程序不执行任何操作时(即方法完成后),窗口才会重绘。如果您删除将其更改为//globol object for contacts database
// Business Logic for AddressBook ---------
function AddressBook(contacts) {
this.contacts = [];
}
AddressBook.prototype.addContact = (contact) => {
this.contacts.push(contact);
}
// Business Logic for Contacts ---------
function Contact(firstName, lastName, phoneNumber) {
this.firstName = firstName,
this.lastName = lastName,
this.phoneNumber = phoneNumber
}
Contact.prototype.fullName = () => {
return this.firstName + " " + this.lastName;
}
var addressBook = new AddressBook();
var contact = new Contact("Ada", "Lovelace", "503-555-0100");
var contact2 = new Contact("Grace", "Hopper", "503-555-0199");
addressBook.addContact(contact);
addressBook.addContact(contact2);
console.log(addressBook.contacts);
的行,则会在五秒钟后看到其颜色更改。
您应该使用计时器来解决问题。
如果需要,您可以强制其提早刷新界面,而无需调用DarkGreen
来调用该方法,该调用将反映您所做的更改,例如颜色更改。
Application.DoEvents();
请注意,在带有用户界面的程序中,使线程休眠是一个坏主意,但出于说明目的,它将向您展示如何使其变色。
答案 1 :(得分:2)
您的问题是因为UI线程被阻止。您需要在单独的线程中运行此逻辑。请尝试以下代码:
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;
});
}
这会将您的按钮转到LimeGreen
,然后等待5秒钟,然后将其返回到DarkGreen
。之所以有效,是因为我们将其旋转到新线程中,因此不会锁定UI。
答案 2 :(得分:0)
我不建议使用Thread.Sleep(),因为它将冻结您的Interface。另外,您需要刷新按钮,以便显示更改。 您可以使用异步和等待方法来延迟按钮颜色更改 在button1_click函数的private关键字之后添加异步 并创建异步Task函数,并使用await awaiting()删除Thread.Sleep()函数。
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);
}
}