繁体   English   中英

经过一段时间后,更改布尔状态的最佳方法是什么?

[英]What is the best way to change bool state after elapsed time?

我正在开发一个程序,该程序可以发送命令并检查收到的答案。 我想实现一个功能,如果程序在一定时间内未收到正确答案,它将更改检查答案状态所需的布尔值。 可以说我在5秒钟内未收到正确答案,而是将布尔值更改为false并停止寻找答案。

这是我需要使用计时器的代码

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        int bytes = COMport.BytesToRead;
        byte[] buffer = new byte[bytes];
        COMport.Read(buffer, 0, bytes);
        SetText(ASCIIEncoding.ASCII.GetString(buffer));


        if(Checked1 )
        {

             if(CheckBox_Port_CommandCheck_1.Checked)
            Check_ReceivedAnswer(ASCIIEncoding.ASCII.GetString(buffer), TextBox_ExpectedAnswer_1.Text, PictureBox_Reply_1);
            if (CheckBox_Port_CommandCheck_2.Checked)
                Check_ReceivedAnswer(ASCIIEncoding.ASCII.GetString(buffer), TextBox_ExpectedAnswer_2.Text, PictureBox_Reply_2);
        }



    }

还有Check_ReceivedAnswer函数

    private void Check_ReceivedAnswer (string expectedA, string receivedA, PictureBox box)
    {

        if (receivedA.Contains(expectedA))
            box.BackColor = Color.Green;
        //Checked1 = false;
    }

因此,如果要检查经过的时间以及是否超过5秒,我想在第一个之后的DataReceivedHandler中停止搜索答案。

您需要异步运行计时器,并且当时间用完时,请更改值,如下所示:

// Create a 5 seconds timer 
    timer = new System.Timers.Timer(5000);

    // Hook up the Elapsed event for the timer.
    timer.Elapsed += OnTimedEvent;

    timer.Enabled = true;


...

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    // Change  your bool val to false
}

如果您有异步方法,则可以使用

public async Task SendCommandAsync()
{
    SendCommandToServer();  
    bool haveAnswer = false;
    await Task.Delay(5000); 
    haveAnswer = IsAnwerHere();

    if (!haveAnswer) {/* after 5 secs still no answer from server*/}
}

如果使用同步方法(并且如果您不想停止调用者线程)

public void SendCommandSync()
{
    SendCommandToServer();
    bool haveAnswer = false;
    Task.Delay(5000).ContinueWith(t =>
    {
        haveAnswer = IsAnwerHere();

        if (!haveAnswer) {/* after 5 secs still no answer from server*/}
    }); 
}

与停止调用者线程同步的方法

public void SendCommandSync()
{
    SendCommandToServer();
    bool haveAnswer = false;
    Thread.Sleep(5000);
    haveAnswer = IsAnwerHere();

    if (!haveAnswer) {/* after 5 secs still no answer from server*/}    
}

UPD

在你的情况下,可能像

private async void Check_ReceivedAnswer(string expectedA, string receivedA, PictureBox box)
{
    await Task.Delay(5000);
    if (receivedA.Contains(expectedA))
        box.BackColor = Color.Green;
    //Checked1 = false;
}

或者甚至可以在调用方功能中等待

private async void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    int bytes = COMport.BytesToRead;
    byte[] buffer = new byte[bytes];
    COMport.Read(buffer, 0, bytes);
    SetText(ASCIIEncoding.ASCII.GetString(buffer));


    if (Checked1)
    {
        await Task.Delay(5000);
        if (CheckBox_Port_CommandCheck_1.Checked)
            Check_ReceivedAnswer(ASCIIEncoding.ASCII.GetString(buffer), TextBox_ExpectedAnswer_1.Text, PictureBox_Reply_1);
        if (CheckBox_Port_CommandCheck_2.Checked)
            Check_ReceivedAnswer(ASCIIEncoding.ASCII.GetString(buffer), TextBox_ExpectedAnswer_2.Text, PictureBox_Reply_2);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM