我正在尝试编写一些代码,以快速将表单的背景更改为随机RGB颜色,但是该程序似乎会停止,直到循环完成,然后再更改一次颜色。
private void button1_Click(object sender, EventArgs e)
{
Random rnd = new Random();
int num1 = rnd.Next(0, 255);
int num2 = rnd.Next(0, 255);
int num3 = rnd.Next(0, 255);
int i;
for(i = 0; i < 100; i++)
{
this.BackColor = Color.FromArgb(num1, num2, num3);
Thread.Sleep(50);
}
}
我错过了哪个部分,或者我使用不当?
谢谢
答案 0 :(得分:2)
您需要更改循环中的值,否则总是一样。另外,更改其背景色后刷新组件。
private void button1_Click(object sender, EventArgs e)
{
Random rnd = new Random();
int num1;
int num2;
int num3;
for (int i = 0; i < 100; i++)
{
num1 = rnd.Next(0, 255);
num2 = rnd.Next(0, 255);
num3 = rnd.Next(0, 255);
this.BackColor = Color.FromArgb(num1, num2, num3);
this.Refresh();
Thread.Sleep(50);
}
}
但是,正如Patrick Hofman指出的那样,您的UI线程将被锁定在此循环中,并且您的表单将被冻结。
解决此问题的第一种方法是致电
Application.DoEvents();
代替Refresh()
但这不是最佳解决方案。
一个好的解决方案是将您的循环放在另一个线程中:
private void button1_Click(object sender, EventArgs e)
{
ThreadStart ts = new ThreadStart(ChangeBackColor);
Thread T = new Thread(ts);
T.Start();
}
private void ChangeBackColor()
{
Random rnd = new Random();
int num1;
int num2;
int num3;
for (int i = 0; i < 100; i++)
{
num1 = rnd.Next(0, 255);
num2 = rnd.Next(0, 255);
num3 = rnd.Next(0, 255);
this.Invoke(new Action(() => this.BackColor = Color.FromArgb(num1, num2, num3));
Thread.Sleep(50);
}
}