c# - 如果第一个未完成处理时再次发生事件会发生什么
问题描述
我的问题是关于DataReceived
来自System.IO.SerialPort
. 我有一个在该事件发生时被调用的方法。我用 读取数据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++ - 我无法通过 vcpkg 导入 range-v3 库
- python - PYTHON - 合并日期索引上的两个数据框
- python - 如何每次运行脚本,同时访问 Flask 页面
- ios - 应用程序获得批准并准备销售后,iOS 应用程序内购买无法正常工作
- flutter - 如何使用颤振以编程方式发送推送通知?
- xamarin - UWP 上的 Xamarin.Auth 失败
- laravel - 如何在 laravel 中的数据表搜索框类型上调用 ajax
- c# - 为什么可选加载项未在功能区上显示为单独的选项卡?
- excel - 从条形图中删除#NV 标签
- java - EntityManager 在 Junit 测试中给出 NullPointerException