Каков наилучший способ изменить состояние bool по истечении заданного времени? - PullRequest
0 голосов
/ 06 июня 2018

Я работаю над программой, которая отправляет команды и проверяет полученный ответ.Я хочу реализовать функцию, при которой если программа через некоторое время не получает правильный ответ, она изменяет bool, необходимый для проверки состояния ответа.Допустим, я не получаю правильный ответ через 5 секунд, я изменяю bool на 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;
    }

Так что в моем DataReceivedHandler после первого, если я хочу проверить истекшее время, и если оно больше 5 секунд, я хочу прекратить искать ответ.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

если у вас есть асинхронный метод, вы можете использовать

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);
    }
}
0 голосов
/ 06 июня 2018

Вам нужно запустить таймер асинхронно, а когда время истечет, измените значение, примерно так:

// 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...