加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

VB.Net中的线程安全

发布时间:2020-12-17 07:24:39 所属栏目:百科 来源:网络整理
导读:我正在尝试在VB中运行一个多线程控制台应用程序并且正在进行线程交叉.基本上我想运行5个线程,让它们不断访问队列,处理并重复,直到没有任何东西.当所有线程都已处理完毕后,我希望他们做其他事情.我正在尝试使用SyncLock来防止多个线程访问,但它似乎没有工作.
我正在尝试在VB中运行一个多线程控制台应用程序并且正在进行线程交叉.基本上我想运行5个线程,让它们不断访问队列,处理并重复,直到没有任何东西.当所有线程都已处理完毕后,我希望他们做其他事情.我正在尝试使用SyncLock来防止多个线程访问,但它似乎没有工作.任何帮助,将不胜感激!

Dim iThread As Integer
Dim manualEvents(4) As ManualResetEvent

Sub Main()
    For i = 0 To 4
        manualEvents(i) = New ManualResetEvent(False)
        ThreadPool.QueueUserWorkItem(AddressOf DoOne)
    Next

    For Each handle As WaitHandle In manualEvents
        handle.WaitOne()
    Next

    ' do other stuff
EndSub

Private Sub DoOne()
    Dim lockObject As New Object()
    SyncLock (lockObject)
        If QueryQueue.DoOne() Then
            DoOne()
        Else
            manualEvents(iThread).Set()
            iThread = iThread + 1
        End If
    End SyncLock
End Sub

解决方法

问题在于锁定资源,您使用lockObject作为同步锁资源,该资源应该是共享的accros线程.
你必须使它成为一个实例字段.

Private Shared lockObject As New Object()
Private Sub DoOne()
  SyncLock (lockObject)
    If QueryQueue.DoOne() Then
        DoOne()
    Else
        manualEvents(iThread).Set()
        iThread = iThread + 1
    End If
  End SyncLock
End Sub

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读