VB.NET线程安全列表?

VB.NET线程安全列表?,vb.net,multithreading,list,locking,thread-safety,Vb.net,Multithreading,List,Locking,Thread Safety,VB.NET、.NET4 大家好, 我有一个(字节)列表,其中包含SerialPort.DataReceived事件上串行缓冲区中的字节。然后我尝试解析数据。解析过程的一部分涉及删除列表中的元素(字节)。我是否应该担心列表被解析过程中可能引发的DataReceived事件修改?我意识到这可能取决于我正在尝试做什么,但是,假设我应该关心(例如,解析过程需要List.Count,直到解析完成才更改),我应该如何确保所有添加调用都等待解析器完成?我猜答案是类似于SyncLock的,但我从来没有真正理解

VB.NET、.NET4

大家好,

我有一个(字节)列表,其中包含SerialPort.DataReceived事件上串行缓冲区中的字节。然后我尝试解析数据。解析过程的一部分涉及删除列表中的元素(字节)。我是否应该担心列表被解析过程中可能引发的DataReceived事件修改?我意识到这可能取决于我正在尝试做什么,但是,假设我应该关心(例如,解析过程需要List.Count,直到解析完成才更改),我应该如何确保所有添加调用都等待解析器完成?我猜答案是类似于SyncLock的,但我从来没有真正理解SyncLock是如何工作的。任何基本的帮助都将不胜感激

提前感谢,,
Brian

嗯,这并不是CPU周期的最大利用,从字节列表中删除字节是一个O(n)操作。进行整体处理步骤O(n^2)。要对cpu施加任何压力仍然是相当困难的,因为串行端口的速度非常慢。只有当您认为工作代码是性能问题时,才应该修改它

如果你还没有,那么考虑从旧的创建一个新的数组或列表。这就是O(n),考虑到数据速率较慢,额外的存储不会有什么坏处。代码也应该更干净


就线程而言,请确保在DataReceived处理程序中执行此操作。这是线程安全的,避免在调用时对UI线程施加过大的压力。

感谢您的响应。是的,我想我可以将新读取的字节作为参数传递给我的parse子例程,并在子例程中执行所有的添加和删除操作。我想我会这么做的。。。但是,如果我能(假设)锁定列表以确保在删除过程中不会发生读取,那么只要将列表传递给其他线程上运行的代码,就可以创建一个新的列表。这样,只有一个线程可以访问列表。自动线程安全。当一段代码决定接收到有效且完整的响应时,这几乎总是很容易做到的。