vb.net - VB.Net 中的线程安全

标签 vb.net multithreading thread-safety console-application

我正在尝试在 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 作为同步锁定资源,它应该在线程中共享。
您必须将其设为实例字段。

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

关于vb.net - VB.Net 中的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6778823/

相关文章:

c++ - 如何保证快速关闭我的 win32 应用程序?

c++ - 具有pthread和锁且无提升的单读者多作者

java - 大负载 OkHTTP 上的流意外结束

需要 Java Singleton 解释

vb.net - 使用 PrintDocument 和 HasMorePages 打印多页

vb.net - 根据另一个组合框选定值设置组合框值 - VB.NET

c# - ASP.NET Webform 在运行时错误上显示 Error.ASPX 页面

java - 使用 Java 调用 VB.NET Web 服务

java - 查询线程执行情况

macos - fprintf 线程在 OS X 上安全吗?