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

时间:2015-03-02 17:33:07

标签: c# multithreading timer

我正在制作记忆游戏。每当用户点击按钮时,都会显示图像。然后用户必须单击另一个按钮。如果两个图像匹配,则按钮将被刻度标记替换。如果没有,那么用户存在1秒的间隙以记住图像位置......然后再次隐藏图像并显示按钮。 我做了1秒的差距       Thread.sleep代码(1000)

我在游戏中嵌入了倒数计时器,持续时间为30秒。我已经贴了一个标签,显示每个时钟刻度的30秒倒计时。


现在实际问题是,每当调用Thread.Sleep(1000)时,计时器都会停止。 1秒后,它恢复。我希望这个计时器能够执行而不管Thread。请帮忙。

1 个答案:

答案 0 :(得分:2)

有点难以理解你所问的是什么,如果我误解了你就道歉,但我想你是在问如何在不阻塞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);
}

然而,这可以按预期工作:当您单击按钮时,一秒钟之后会出现“哎哟!”这个词。出现在文本框中。这是因为在BeginInvoke委托的文本框控件上使用MethodInvoker方法会导致委托在拥有控件的线程(即主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);
}