我有一个串口,我想保持它开放以接收消息。这是正确的方法吗?我想在没有while循环的情况下完成此操作,但我认为如果删除它将完成void()和连接。或者这是不正确的,只要我不关闭连接,它将继续接收数据(参见代码块2)?
public void Scanner(object sp)
{
this.sp = (SerialPort)sp;
this.sp.Open();
this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
Console.WriteLine("port {0} open waiting message", this.sp.PortName);
while (!_terminate)
{
Thread.Sleep(100);
}
Console.WriteLine("termination code received closing port {0}.", this.sp.PortName);
this.sp.Close();
}
还是喜欢这个?
public void Scanner(object sp)
{
this.sp = (SerialPort)sp;
this.sp.Open();
this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
}
另一件事是我觉得我应该把事件处理程序移到虚空之外。 void由ParameterizedThreadStart调用,因此它的签名必须是void name(object o){}。我想我应该把它移到构造函数中吗?
现在构造函数
public SerialComms(){}
我认为它应该是
public SerialComms()
{
this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
}
答案 0 :(得分:1)
基本上我认为第2块更好,因为如果有可用数据,您会收到异步通知。只要你不打电话给"关闭" comport的方法,它将接收数据。
此外,我建议(关于事件主题)制作两个分离的方法,如:
public void OpenPort()
{
this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
this.sp.Open();
}
public void ClosePort()
{
this.sp.Close();
this.sp.DataReceived -= new SerialDataReceivedEventHandler(sp_DataReceived);
}
第二种方法对取消注册事件非常重要。例如,如果您关闭应用程序。否则您的应用程序将挂起。如果您注册了事件,请务必取消注册事件,因为事件处理程序也会阻止垃圾收集清理对象。