C# 使用C在循环中褪色#

C# 使用C在循环中褪色#,c#,loops,for-loop,colors,thread-sleep,C#,Loops,For Loop,Colors,Thread Sleep,我正在尝试将文本框的颜色更改为绿色,然后淡入白色作为确认方法。以下是我目前掌握的代码: private void btnCommit_Click(object sender, EventArgs e) { //do stuff Color c = new Color(); for (int i = 0; i <= 255; i++) { c = Color.FromArgb(i, 255, i); textBox1.Back

我正在尝试将文本框的颜色更改为绿色,然后淡入白色作为确认方法。以下是我目前掌握的代码:

private void btnCommit_Click(object sender, EventArgs e)
{
    //do stuff

    Color c = new Color();
    for (int i = 0; i <= 255; i++)
    {
        c = Color.FromArgb(i, 255, i);
        textBox1.BackColor = c;

        System.Threading.Thread.Sleep(10);
    }     
}
private void btnCommit\u单击(对象发送方,事件参数e)
{
//做事
颜色c=新颜色();

对于(int i=0;i
Thread.Sleep
阻止UI线程(如果像您的案例一样使用UI线程执行),您必须使用
Task.Delay()
并使您的方法
async
使UI响应并查看衰减动画:

private async void btnCommit_Click(object sender, EventArgs e)
{
    //do stuff

    Color c = new Color();
    for (int i = 0; i <= 255; i++)
    {
        c = Color.FromArgb(i, 255, i);
        textBox1.BackColor = c;

        await Task.Delay(10);
    }     
}
private async void btnCommit\u单击(对象发送方,事件参数e)
{
//做事
颜色c=新颜色();

对于(int i=0;i
Thread.Sleep
阻止UI线程(如果像您的案例一样使用UI线程执行),您必须使用
Task.Delay()
并使您的方法
async
使UI响应并查看衰减动画:

private async void btnCommit_Click(object sender, EventArgs e)
{
    //do stuff

    Color c = new Color();
    for (int i = 0; i <= 255; i++)
    {
        c = Color.FromArgb(i, 255, i);
        textBox1.BackColor = c;

        await Task.Delay(10);
    }     
}
private async void btnCommit\u单击(对象发送方,事件参数e)
{
//做事
颜色c=新颜色();

对于(int i=0;i)来说,每次迭代1000毫秒的等待将花费255秒,我认为OP不适合这样做。我没有注意到计数器是255,已修复。好吧,它可以工作,但这与DoEvents有相同的问题。代码重入。如果在执行循环时再次单击按钮,循环将再次启动(如果没有--do stuff--comment,这将是一个小问题)@Steve我认为在方法结束之前禁用按钮并启用它是一种解决方案。@fic
任务。延迟
不是100%准确。对我来说,
10ms
1ms
之间的差异考虑到执行等待和恢复上下文所需的时间,使等待时间变得毫无意义或者
1ms
1000毫秒的每次迭代等待将花费255秒,我认为OP不适合这样做。没有注意到计数器是255,已修复。好吧,它可以工作,但这与DoEvents有相同的问题。代码重入。如果在执行循环时再次单击按钮,循环将再次启动(如果没有--do stuff--comment,这将是一个小问题)@Steve我认为在方法结束之前禁用按钮并启用它是一种解决方案。@fic
任务。延迟
不是100%准确。对我来说,
10ms
1ms
之间的差异考虑到执行等待和恢复上下文所需的时间,使等待时间变得毫无意义或者
1ms
btnClick正在UI线程上执行,因此您会看到一个冻结。您可以使用WPF动画,也可以使用下面的anwer中所示的异步,或者在后台任务中运行此代码,该任务使用Dispatcher.BeginInvoke更新背景色。在哪个上下文中使用此命令?您是否考虑对此任务使用CSS或更少的命令?btnClick正在执行在UI线程上,因此您会看到冻结。您可以使用WPF动画,也可以使用下面的anwer中所示的异步,或者在后台任务中运行此代码,该任务使用Dispatcher.BeginInvoke更新背景色。这是在哪个上下文中使用的?您是否考虑过为该任务使用CSS或更少的CSS?