c#-如果第一个未完成处理时再次发生事件会发生什么
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-如果第一个未完成处理时再次发生事件会发生什么,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1762字,纯文字阅读大概需要3分钟。
内容图文
![c#-如果第一个未完成处理时再次发生事件会发生什么](/upload/InfoBanner/zyjiaocheng/669/c33d5a0eaf024e90a7b7d0946a7ae4d4.jpg)
我的问题是关于System.IO.SerialPort的DataReceived事件.我有一个方法,该事件发生时将被调用.我使用myPort.ReadExisting读取数据,对其进行处理并保存.如果我得到一个特定的字符,那么到那时的数据将被解释为命令,并触发另一个事件.
我的问题是,如果我正在处理接收到的数据并收到新数据,该怎么办?该方法的新实例是否在等待旧方法完成?否则,可能会导致冲突,因为该方法的两个实例都使用相同的变量.我在事件处理的概念上是错了吗,还是有一种优雅的方式来处理这一问题?
我的代码运行良好,并且结果符合预期,但我的数据处理并不那么复杂.我只是想了解这个问题,并避免以后再遇到问题.
我的代码示例如下:
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
int index = m_ports.FindIndex(p => p.PortName == port.PortName);
string tmpData;
m_currentData[index] += tmpData = port.ReadExisting();
Console.WriteLine(tmpData);
string currentData = m_currentData[index];
string currentOrder = "";
while (currentData.Contains(orderEndChar))
{
int endCharLocation = currentData.IndexOf(orderEndChar);
currentOrder = currentData.Substring(0, endCharLocation);
currentData = currentData.Substring(endCharLocation + 1);
orderEvent.gotOrder(currentOrder);
//orderEvent.gotOrder(new EventArgs());
}
m_currentData[index] = currentData;
}
列出这些是因为我希望它与可以从中获取命令的多个端口一起使用.
解决方法:
在辅助线程上调用SerialPort.DataReceived.
在这里阅读:
https://msdn.microsoft.com/fi-fi/library/system.io.ports.serialport.datareceived(v=vs.110).aspx
因此,如果有许多SerialPort实例在侦听,则可能会同时运行多个Port_DataReceived方法.但是不要害怕局部变量,因为它们只存在于特定的方法调用中.因此,运行相同方法的3个不同线程将启动3个不同的局部变量,即使它们的名称相同.但是要小心全局变量.
由于Port_DataReceived是同步的,因此对同一SerialPort对象的下一个事件调用将等待,因此将逐个执行这些调用.
内容总结
以上是互联网集市为您收集整理的c#-如果第一个未完成处理时再次发生事件会发生什么全部内容,希望文章能够帮你解决c#-如果第一个未完成处理时再次发生事件会发生什么所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。