我正在努力处理与我的通信课相关的事件。
每次通过串行连接接收新数据时,我都会通过事件处理程序调用'DataChange'函数。然后我继续将这些数据加载到DataGridView,为用户执行一些格式化等。由于调用DataChange事件的频率,我遇到了很多问题,并且似乎从中间过程的其他子程序和函数中窃取了焦点。
例如,我将尝试将数据传输回串行设备。在格式化数据之后,但在我实际上从库中调用Send函数之前,焦点将被引导回DataChange并且我从未实际传输过我的数据。
这是一个问题,通过线程化DataChange相关例程,在函数或例程之前解除DataHhange事件然后重新挂钩,或者是否存在一些我没有实现的基本原则来解决这个问题。
答案 0 :(得分:1)
这听起来可能是线程同步问题。
事件本质上是线程化的,因此通过添加线程来解决它不是问题。
尝试使用SyncLock确保线程同步。
每当您收到数据时,请锁定一个对象,直到您使用完该数据为止。
SyncLock lockObject
'Handle data changed...
End SyncLock
我认为这种情况的用语是竞争条件。
答案 1 :(得分:0)
让您的数据进入一个线程的缓冲区并从另一个线程中查看缓冲区。在主线程上将缓冲区标记为“准备发送”并使用辅助线程监视它。只需确保SyncLock对象。根据您的数据,您可以创建一个对象来包装它,只需使用布尔标志,然后将其转储到List(Of T)中。让您的监视器线程休眠50或任何毫秒,锁定缓冲区并检查标志,拉出所需内容,解锁列表并推出数据。