Vb.net 无法在VB中停止线程

Vb.net 无法在VB中停止线程,vb.net,multithreading,Vb.net,Multithreading,我有以下代码 Dim x As Integer = 0 Dim evtReport(SomeMap.Keys.Count - 1) As ManualResetEvent For Each DeviceIp As String In SomeMap.Keys evtReport(x) = New ManualResetEvent(False) Dim thdReport As New Thread(New ParameterizedThreadStart(Sub() Me.C

我有以下代码

Dim x As Integer = 0
Dim evtReport(SomeMap.Keys.Count - 1) As ManualResetEvent
 For Each DeviceIp As String In SomeMap.Keys

    evtReport(x) = New ManualResetEvent(False)
    Dim thdReport As New Thread(New ParameterizedThreadStart(Sub() Me.CollectReportsNew(DeviceDetailsMap(DeviceIp), evtReport(x))))

    thdReport.Name = "Something"
    thdReport.Start()
     If (x < evtReport.Count - 1) Then
        x = x + 1
     End If
 Next
Dim x作为整数=0
将EVT端口(SomeMap.Keys.Count-1)设置为手动重置事件
对于SomeMap.Keys中的每个DeviceIp作为字符串
evtReport(x)=新手动重置事件(False)
Dim thdReport作为新线程(新的参数化线程启动(Sub()Me.CollectReportsNew(DeviceDetailsMap(DeviceIp),evtReport(x)))
thdReport.Name=“某物”
thdReport.Start()
如果(x
现在我要做的是从
CollectReportsNew
方法中按索引设置
ManualReset
事件

但是,在
CollectReportsNew
方法中,我看到相同的
evtReport
元素被发送。这是因为x的最后一个索引被发送,而不是每个线程都获得自己的元素


我不明白为什么会这样

我只能在if语句中看到x被更改-我会检查以确保if语句是否进入其代码中-我怀疑它不是。这可能是一个错误。将lambda转换为临时变量为x的匿名函数/委托。@FreudianSlip即使没有if语句,在传递到
CollectReportsNew
方法时,它看起来也是最后一个值x。为什么要使用原始线程而不是
任务。运行
?或
并行。对于
?或者使用ManualResetEvent而不是CancellationToken?我建议您检查一下执行并行处理和取消的简单程度。您也可以对原始线程使用CancellationToken