C#:如何在不停止程序执行的情况下执行线程

C#: How to execute thread without halting program execution

我正在做一个记忆游戏。每当用户单击按钮时,都会显示图像。然后用户必须单击另一个按钮。如果两个图像匹配,则按钮将替换为刻度线。如果不是,则用户有 1 秒的时间来记住图像位置。然后再次隐藏图像并显示按钮。 我做 1 秒的差距 Thread.Sleep(1000)

我在游戏中嵌入了一个持续时间为 30 秒的倒数计时器。我放置了一个标签,显示每个时钟滴答的 30 秒倒计时。


现在实际的问题是,每当调用 Thread.Sleep(1000) 时,计时器都会停止。 1 秒后,它会恢复。无论线程如何,我都希望这个计时器执行。请帮忙。

有点难以准确理解您的要求,如果我误解了您,我深表歉意,但我认为您是在询问如何在新线程上使用计时器更新 UI 而无需阻塞 UI 线程?答案是您不能在创建它的线程以外的线程中更新 UI 控件。相反,您必须创建一个委托来为您做这件事。

所以,这给了你一个异常,因为定时器结束时的回调 UpdateText 在定时器线程上执行,而不是在主 UI 线程上执行:

private void button1_Click(object sender, EventArgs e)
{
    System.Threading.Timer timer = new System.Threading.Timer(UpdateText, null, 1000, System.Threading.Timeout.Infinite);
}

public void UpdateText(object state)
{
    this.textBox1.AppendText("Ouch!" + Environment.NewLine);
}

然而,这按预期工作:当您单击该按钮时,一秒钟后文本框中会出现单词 "Ouch!"。这是因为在带有 MethodInvoker 委托的文本框控件上使用 BeginInvoke 方法会导致委托在拥有该控件的线程(即主 UI 线程)上执行,而不是在在计时器线程上:

private void button1_Click(object sender, EventArgs e)
{
    System.Threading.Timer timer = new System.Threading.Timer(UpdateText, null, 1000, System.Threading.Timeout.Infinite);
}

public void UpdateText(object state)
{
    MethodInvoker action = delegate
    {
        this.textBox1.AppendText("Ouch!" + Environment.NewLine);
    };

    this.textBox1.BeginInvoke(action);
}