C# BackColor属性在代码中未正确更改。关于我';我做错了?

C# BackColor属性在代码中未正确更改。关于我';我做错了?,c#,windows,winforms,C#,Windows,Winforms,中间C#dev在这里。试图通过编写一个简单的Simon clone(仅限私人学习,我没有任何版权,也不打算分发/销售)过渡到游戏编程,我被卡住了 以下是到目前为止完整代码的链接: 问题在于下面的PlayTile()方法: private void PlayTile(Button btnColorOfTile, Color lightedTileColor, SoundPlayer tileSoundPlayer, Color originalTileColor) { //

中间C#dev在这里。试图通过编写一个简单的Simon clone(仅限私人学习,我没有任何版权,也不打算分发/销售)过渡到游戏编程,我被卡住了

以下是到目前为止完整代码的链接:

问题在于下面的
PlayTile()
方法:

private void PlayTile(Button btnColorOfTile, Color lightedTileColor, SoundPlayer tileSoundPlayer, Color originalTileColor)
    {
        // ***BUG03***
        TilePress(btnColorOfTile, lightedTileColor, tileSoundPlayer);
        // Small pause so tile can be lit before instantly changing back
        Thread.Sleep(SLEEP_TIME);
        TileRelease(btnColorOfTile, originalTileColor, tileSoundPlayer);
        // Small pause between each tile play so that you can distingish multiple plays of the same tile.
        Thread.Sleep(SLEEP_TIME);
    }
这可以通过更改
BackColor
属性来“点亮”磁贴,播放磁贴声音时暂停半秒(
睡眠时间设置为500ms),然后将
BackColor
更改回正常颜色

声音在暂停和其他情况下正常播放,但瓷砖没有改变颜色。我在
TilePress()
中更改
BackColor
属性,然后在
TileRelease()
中将其更改回,该属性在MouseUp和MouseDown中为磁贴的事件处理程序调用,并且工作正常

你知道为什么
PlayTile()
用于声音,但不改变
背景色
属性吗

另外,如果你看到代码中有任何明显的错误,请告诉我。这对我来说都是关于学习的,所以需要建设性的批评


提前感谢您的帮助

Thread.Sleep会阻止您的UI线程(这意味着您的窗体无法处理任何窗口消息,如键盘、鼠标、移动、绘制等。这是一种“无响应”状态,不是所需的行为)

您可以改用async/await

例如:

async Task PlayTile()
{
    this.BackColor = Color.Red;
    await Task.Delay(500);
    this.BackColor = Color.White;
    await Task.Delay(500);
}

async private void button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 10; i++)
    {
        await PlayTile();
    }
}
async Task PlayTile()
{
this.BackColor=Color.Red;
等待任务。延迟(500);
this.BackColor=Color.White;
等待任务。延迟(500);
}
异步私有无效按钮1\u单击(对象发送方,事件参数e)
{
对于(int i=0;i<10;i++)
{
等待PlayTile();
}
}

您使用
thread.Sleep(Sleep\u TIME)阻止UI线程。使用定时器。(或
wait Task.Delay(SLEEP_TIME)
)我知道
Thread.SLEEP()。在这种情况下,需要这种行为(玩家没有控制权,计算机向玩家显示要模仿的模式)。我想让程序“点亮”瓷砖,暂停半秒钟,然后更改
背景色。我没有使用
等待Task.Delay()
,让我来研究一下。感谢您的回复。您是否尝试调用Invalidate();将颜色设置为表单后?我没有,让我查看
Invalidate()
的作用。谢谢。@Sylverac我想我们谈的不一样。当我说阻塞时,这意味着您的表单无法处理任何窗口消息,如键盘、鼠标、移动、绘制等。这是一种“无响应”状态,不是期望的行为。我认为您完全让我走上了正确的道路,我只是在实现它时遇到了问题。我添加了一个更新,上面有更多问题。非常感谢你的帮助。不管怎样,我已经弄明白了。我还需要为
PlayTile()
任务的所有调用添加等待。现在效果很好。谢谢