[英]What is the best way to stop a C# function for elapsed time without multithreading
[英]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.