C# 如何在固定时间内更改按钮的背景色?

C# 如何在固定时间内更改按钮的背景色?,c#,timer,C#,Timer,当某个值来自串行端口时,我想在固定时间内更改按钮的背景色。我在这里设置了计时器对象: public formLabel() { InitializeComponent(); // ... timerColor.Tick += timerColor_Tick; timerColor.Interval = 3000; } 然后,当我从串行端口接收信号时: private void DataReceivedHandler(object sender, SerialDa

当某个值来自串行端口时,我想在固定时间内更改
按钮的
背景色。我在这里设置了
计时器
对象:

public formLabel()
{
    InitializeComponent();
    // ...
    timerColor.Tick += timerColor_Tick;
    timerColor.Interval = 3000;
}
然后,当我从串行端口接收信号时:

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    MessageBox.Show("Dati Ricevuti: " + indata);
    if (indata.CompareTo("K") == 0)
    {
        timerColor.Enabled = true;
        btnEsito.BackColor = Color.Green;
        btnEsito.Text = "GOOD";
        // Do something
    }
    if (indata.CompareTo("O") == 0)
    {
        timerColor.Enabled = true;
        btnEsito.BackColor = Color.Red;
        btnEsito.Text = "NO GOOD";
    }
}
下面是停止计时器的方法:

private void timerColor_Tick(object sender, EventArgs e)
{
    MessageBox.Show("HERE!");
    timerColor.Enabled = false;
    btnEsito.BackColor = Color.White;
}
根据我收到的信号类型,
btnEsito
背景色变为绿色或红色,但程序没有显示消息
“HERE!”
,按钮也没有变为白色


有人能帮我吗?

System.Windows.Forms.Timer是为单线程使用而设计的,需要在UI线程上启动和停止。您试图在一个单独的线程上启动计时器,因此需要确保在UI线程上完成对计时器启用属性的修改。您可以通过创建一个委托方法并从事件处理程序调用该方法来实现这一点-可能类似于:

delegate void TimerDelegate(bool Enable);
private void ControlTimer(bool Enable)
{
  timerColor.Enabled = Enable;
}

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    MessageBox.Show("Dati Ricevuti: " + indata);
    if (indata.CompareTo("K") == 0)
    {
        Invoke((TimerDelegate)ControlTimer, true);
        btnEsito.BackColor = Color.Green;
        btnEsito.Text = "GOOD";
        // Do something
    }
    if (indata.CompareTo("O") == 0)
    {
        Invoke((TimerDelegate)ControlTimer, true);
        btnEsito.BackColor = Color.Red;
        btnEsito.Text = "NO GOOD";
    }
}

private void timerColor_Tick(object sender, EventArgs e)
{
    MessageBox.Show("HERE!");
    Invoke((TimerDelegate)ControlTimer, false);
    btnEsito.BackColor = Color.White;
}

您使用哪种类型的计时器?System.Windows.Forms.timer不正确@布罗特,就是这样!很好!