我在现有应用程序中遇到问题,因为可能会从不同的线程调用子程序,因此可能会覆盖变量数据。
我想确保每次调用子例程时,从调用它的任何线程开始,它都会使用它的当前参数值完成,然后再使用任何新参数值运行。
子程序名为" WriteValueToTag"在Form类中并接受两个参数ByVal。
Private Function WriteValueToTag(ByVal PLCTagValue As Object, ByVal PLCTagName As Logix.Tag) As Boolean
Try
Dim retry As Integer = 1
Dim result As Boolean = False
Dim writeLock As New Object
Do While retry < 3
result = WriteToPLC(mPLC, PLCTagName)
If (result) Then 'success
Exit Do
Else 'retry write to PLC
retry += 1
Log.Debug(" WriteToPLC failed - retry attempt #{0}", retry)
End If
Loop
Return result
Catch ex As Exception
HandleError(ex, False)
Return False
End Try
End Function
子程序调用一个名为&#34; WriteToPLC&#34;的函数(位于模块中)。并在ByRef中传递这些参数。
Public Function WriteToPLC(ByRef PLC As Logix.Controller, ByRef PLCTag As Logix.Tag) As Boolean
我不确定如果简单地在WriteToPLC周围添加一个SyncLock可以工作,或者我可以以某种方式线程(队列)对WriteToPLC的调用,以便它们按顺序发生,但我在尝试获取ThreadPool.QueueUserWorkItem用于调用WriteToPLC,因为该函数接受两个参数并返回一个布尔值。
SyncLock是否足以通过允许WriteToPLC在下一次调用之前完成来解决这个问题?
...
Dim writeLock As New Object
Do While retry < 3
SyncLock writeLock
result = WriteToPLC(mPLC, PLCTagName)
End SyncLock
...
有关正确线程/排队的任何帮助和代码示例都将不胜感激。
答案 0 :(得分:0)
您需要将锁定对象移动到SyncLock
的函数外部才能正常工作:
Private writeLock As New Object
Private Function WriteValueToTag(ByVal PLCTagValue As Object, ByVal PLCTagName As Logix.Tag) As Boolean
SyncLock writeLock
Try
Catch
End Try
End SyncLock
End Function