我正在从串行端口接收数据,将每一行放入队列中,然后将这些行出列,稍微格式化它们(删除一些前导字符,修剪等),然后在列表框中显示格式化的行。
我使用 Timer 每 200 毫秒触发一次出队方法。一切正常,但似乎有点迟钝/缓慢。
我正在考虑使用 BackgroundWorker 来处理出队和格式化,但我被卡住了。
我尝试在 FormLoad 中启动后台工作程序,但很快意识到它只会在代码中运行一次。我在 backgroundworker 代码中尝试了一个标签并转到以创建一个循环(我知道,不好),但这让我的 CPU 使用率很高,甚至没有工作。
我还尝试在我的串行接收事件中使用“backgroundWorker1.RunWorkerAsync();”在每次新数据进入时运行它,但这会引发“后台工作人员当前正忙”异常
所以,我需要后台工作人员不断处理队列(出队)。
代码:这是我的数据接收事件,下面是我的出队代码,它位于后台工作程序中。非常感谢任何帮助。
// Serial Data Received
private void serialPort1_DataReceived(
object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = serialPort1.ReadTo("\u0003");
q.Enqueue(RxString);
}
下一个代码是出队代码:
// Dequeue items, format, then display in listbox
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (q.Count == 0)
{
// do nothing if q is empty
}
else
do
{
output = (q.Dequeue().ToString());
output = output.TrimStart(new char[] { (char)02 });
output = output.TrimEnd(new char[] { (char)03 });
if (output.StartsWith("C"))
{
ClearAll();
}
else if (output.StartsWith("W98"))
{
txtTax.Text = (output.Remove(0, 5));
}
else if (output.StartsWith("W99"))
{
txtTotal.Text = (output.Remove(0, 24));
}
else
{
listOrderItems.Items.Add(output.Remove(0, 5));
listOrderItems.SelectedIndex = listOrderItems.Items.Count - 1;
}
} while (q.Count > 0);
}