【问题标题】:.NET Serial Port DataReceived (On/Off).NET 串行端口数据已接收(开/关)
【发布时间】:2011-08-20 00:22:28
【问题描述】:

我正在使用 .NET 4 串行端口类和 DataReceived 处理程序。

在 DataReceive 处理程序中,我从串行端口中删除处理程序,处理数据,并在函数末尾重新添加处理程序。

try
{
  serial_port.datareceived -= new serialdatareceivedeventhandler(ondatareceived);

  // readline and process data
}
catch (exception ex)
{
}
finally
{
  serial_port.datareceived += new serialdatareceivedeventhandler(ondatareceived);
}

这种用法有什么后果(如果有的话)?它似乎工作得很好,虽然我没有长期测试过。我应该研究不同的方法吗?如果可能,请提供一个简单的代码示例/大纲。谢谢。

【问题讨论】:

  • 你为什么要这样做?避免重新进入?顺便说一句:这样你可能会丢失一些数据......
  • 让我想知道框架是否真的可能或阻止了重入
  • @yahia - 是的,以避免在处理收到的数据时重新进入。数据丢失不是问题,因为设备是手动激活的,因此我永远不会丢失数据。
  • @BoxerJoe 删除监听器并不能防止重入问题。如果可以重入,则该事件可能会在您移除处理程序之前触发两次(或者由于竞争条件或不一致的内部委托操作,它甚至可能在您移除处理程序后触发)。

标签: .net serial-port


【解决方案1】:

我个人不会删除每个 DataReceived 事件的处理程序,这是不必要的。如果您没有收到传入数据的通知,则总是有可能超出现有缓冲区并丢失信息。

我会使用类似于Microsoft Example:

来自上面的 MSDN 文章:

 private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
 {
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    Console.WriteLine("Data Received:");
    Console.Write(indata);
  }

【讨论】:

  • 我正在处理程序中进行数据库插入,但不确定事件是否可重入,我正在处理的设备也是手动激活的,因此我永远不会丢失数据。我只是不知道这样做是否有问题。
  • 附加和分离事件处理程序时会产生开销。如果您不希望它是可重入的,我可能会从事件处理程序中卸下所有繁重的工作,并将传入的数据放入队列中,并让您的数据库例程监视队列中的数据。
  • 这是个好主意。我确实需要立即向用户提供有关在数据库中成功记录事件的实时反馈。一个用户每十五秒只能激活一次设备,但另一个用户可以在前一个用户之后立即出现并激活设备。 (顺便说一句,看起来你在做一些有趣的事情……是那些混凝土搅拌系统吗?)
  • 是的,我安装了混凝土搅拌系统,另外还编写了使植物保持完整骨料的软件。
【解决方案2】:

如果您担心重入,请使用lock 或互斥锁:

lock(lockobj)
{
    /*Read data from the port here.*/
}

取消订阅事件并不能成功阻止重入,因为由于抢占式调度(与协作多线程或类似的东西相反),您的代码可能会在进入方法之后(甚至在此之前)被抢占您有机会取消订阅,更多数据到达,再次触发该机制。

实际上,文档明确指出,

Only one event handler can execute at a time.

【讨论】:

    【解决方案3】:

    关于此代码:

    catch (exception ex)
    {
    }
    

    永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远写这样的代码。

    这就像拆除您孩子卧室的烟雾探测器。

    【讨论】:

    • 这显然不是实际代码...您的答案属于评论(或者最好保留给自己,因为它非常粗鲁)。
    • 如果不是实际代码,为什么会出现?我相信我的帖子很有帮助。
    • 这是什么答案?
    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多