快速随机地更改表单背景颜色

时间:2018-10-05 06:15:56

标签: c#

我正在尝试编写一些代码,以快速将表单的背景更改为随机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);
        }
}

我错过了哪个部分,或者我使用不当?
谢谢

1 个答案:

答案 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);
    }
}