C#BackgroundWorker和Com端口问题
本文关键字:问题 Com C#BackgroundWorker | 更新日期: 2023-09-27 18:29:38
好的。我有一个监视2个COM端口的程序。一个挂在磅秤上,另一个挂到modbus板上。
我的问题出在连接到modbus板的COM端口上。我的程序是每100MS读取一个传感器(在modbus板上)。它返回0或1(通过COM端口)以确定传感器是否被阻塞。如果它被阻塞,则通过端口向板发送信号。
我的问题是我无法停止监测传感器,但在发送其他信号之前,我必须确保com端口没有使用。
监视传感器的例程位于后台工作线程上。一旦传感器跳闸,就会产生另一个线程,向modbus板发送信号。因此,当我向电路板发送信号时,我需要暂停"传感器线程"。我该怎么做?
记住它是一个BackgroundWorker,所以Thread.Join不是一个选项。
这是我的代码:
private void SensorThread_DoWork(object sender, DoWorkEventArgs e)
{
if (SensorThread.CancellationPending == true)
e.Cancel = true;
else
{
ReadSensor();
}
}
此线程的RunWorkerCompleted只是重新启动线程。以下线程不断监测"传感器状态",以查看传感器何时被阻塞:
public void ScaleThread_DoWork(object sender, DoWorkEventArgs e)
{
if (ScaleThread.CancellationPending == true)
{
e.Cancel = true;
}
else
{
//sensor is blocked
if (sensorstatus == 0)
{
ReadScale();
prevgate = gate;
gate = DetermineGate();
//SaveData();
SetOpenDelay();
SetDuration();
//no gate was selected, meat out of range, runs off end
if (gate == 0)
{
txtStatus.Invoke(new UpdateStatusCallback(UpdateStatus), new object[] { meatweight.ToString() +
"lbs is out of range"});
}
else
{
//this triggers a thread to send a signal to the modbus board
gateTimer.Start();
}
}
}
}
为此完成的RunWorkerCompleted重新启动该线程,使其成为一个循环
创建一个负责所有发送操作的线程。实现一个队列,该队列向该线程提供要发送到设备的消息。您可以使用新的BlockingCollection<T>
轻松地实现这一点。
或者,使用TPL创建一个有限并行度为1的TaskScheduler
,如下所示:http://msdn.microsoft.com/en-us/library/ee789351.aspx
现在,您可以简单地触发要发送到设备的任务,它们将按顺序执行。
除非需要在发送方和读取器之间传递信息,否则我会在其自己的独立线程上实现读取器操作。