在VB.NET中正确地使用等待或阻塞来池或启动线程

时间:2015-06-03 16:49:51

标签: .net vb.net multithreading threadpool

我在现有应用程序中遇到问题,因为可能会从不同的线程调用子程序,因此可能会覆盖变量数据。

我想确保每次调用子例程时,从调用它的任何线程开始,它都会使用它的当前参数值完成,然后再使用任何新参数值运行。

子程序名为" 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
...

有关正确线程/排队的任何帮助和代码示例都将不胜感激。

1 个答案:

答案 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