我有多个客户端和一个服务器,它通过TCP传递对象更新。
基本上,服务器运行一个访问对象的算法,但这些可能会在通过TCP发送更新时发生变化。
我已设置标志以检查针对数据库的更新,并且仅在本地内存或数据库服务器之间存在数据差异时才发送更新。问题是如果对象在迭代时发生了更改。
算法是在后台线程下运行的,代码架构总结如下,它是事件驱动的:
算法后台主题:
Private algorithm As New NewAlgorithmTest
Private Sub bg_workerAlgorithm_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bg_workerAlgorithm.DoWork
algorithm.RunAlgorithm()
End Sub
Private Sub bg_workerAlgorithm_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bg_workerAlgorithm.RunWorkerCompleted
bg_workerAlgorithm.RunWorkerAsync()
End Sub
从客户收到的Tcp消息:
Private Sub Client_MessageReceived(sender As Object, e As TcpClient.MessageRecievedEventArgs)
Dim message As String = e.Message
'figure out which object to update based off message and set it as updatedObject
dim updatedObject
updatedObject.GetLatest()
End Sub
如何解决此问题?
答案 0 :(得分:1)
如果在迭代完成之前无法阻塞线程,那么我将实现一个Stack<> (基于FIFO)收到的消息。
这将保留消息进入。然后您可以依次触发每个消息的后台线程,确保只有一个更新触发了Db上的迭代。
的Si