0

我有向一批计算机发送 ping 的代码,并向任何响应他们在线的人打开 VNC 会话。

ping 在 parallel.foreach 循环中发送,并在收到回复时引发事件。

尽管在 AddHost 代码周围放置了一个同步锁块,但它仍然被多个线程同时输入。

我认为这与另一个对象上的 raiseevent 调用的代码有关。

这是处理事件的方法

Private Sub AddHost(hostname As String)
    ' panesList is an list(of RemoteDesktop) prepopulated with  36 individual RemoteDesktop objects
    Dim vnc As RemoteDesktop = panesList(Position)
    vnc.GetPassword = New AuthenticateDelegate(Function() vncPassword)
    SyncLock Semaphore
        Try
            If Position = 36 Then
                Return
            End If

            vnc.Connect(hostname, 0, True, True)
            Position += 1

        Catch ex As Exception

        End Try
    End SyncLock

End Sub


Private Sub HandleConnect(hostFilter As String)
    AddHandler OnlineFinder.LiveComputer, AddressOf AddHost
    Dim bg As New Task(Sub() OnlineFinder.CheckFilteredASync(hostFilter))
    bg.Start()
    ' AddHandler OnlineFinder.SearchComplete, AddressOf Finished
End Sub

从对象 OnlineFinder.vb

    Public Sub CheckFilteredASync(filterString As String)
    Dim Ctable As DataTable = CTableAdapter.GetDataByPartName($"{filterString}%")
    Dim clist As New List(Of String)
    For Each drow As DataRow In Ctable.Rows
        clist.Add(drow.Field(Of String)("Name"))
    Next
    Searching = True
    Dim parallelLoopResult = Parallel.ForEach(clist, Sub(site) Ping(site))
    RaiseEvent SearchComplete()
End Sub

    Private Sub Ping(host As String)
    If ValidPing(host) Then
        RaiseEvent LiveComputer(host)
    End If
End Sub

我应该怎么做,所以一次只处理一个事件(但它不会挂起 UI)

4

0 回答 0