将For Loop转换为Parallel.For进行数据比较不起作用

时间:2019-07-07 05:36:21

标签: vb.net for-loop parallel.for

我正在通过从独立的读取器读取指纹并将其与数据库中的模板进行比较来创建指纹验证应用程序。该读取器随附内置SDK,可轻松验证指纹是否匹配。

使用普通的Loop语句,无论是For Each还是For Next,甚至是Queue&Dequeue(当然不是Loop),都没有问题来获取所捕获指纹的正确所有者。一切都很好

但是当我尝试将流程转换为Parallel.For时,似乎无法“找到”所捕获模板的正确所有者,或者只是无法执行匹配流程。

'normal Loop through DataTable, working fine
'Capfpstr is the captured fingerprint from reader
'Zkfp.VerFingerFromStr is a build-in SDK function

Dtc = DataTable.Rows.Count.ToString
For i As Integer = 0 To Dtc - 1
    Dbuserid = DataTable.Rows(i)(1) 'user id column           
    Dbfp = DataTable.Rows(i)(15) 'fingerprint template column
    Dbfpstr = Convert.ToBase64String(Dbfp, 0, Dbfp.Length)
    Userfound = Zkfp.VerFingerFromStr(Dbfpstr, Capfpstr, True, False)      
    If Userfound = True Then
        FrmMAIN.LblUSER.Text = Dbuserid.ToString
        Exit For
    End If
Next i

'Parallel.For won't able to find the user id
'Capfpstr is the captured fingerprint from reader
'Zkfp.VerFingerFromStr is a build-in SDK function

Dtc = DataTable.Rows.Count.ToString
Parallel.For(0, Dtc, Sub(i)
      Dbuserid = DataTable.Rows(i)(1) 'user id column                                      
      Dbfp = DataTable.Rows(i)(15) 'fingerprint template column
      Dbfpstr = Convert.ToBase64String(Dbfp, 0, Dbfp.Length)
      Userfound = Zkfp.VerFingerFromStr(Dbfpstr, Capfpstr, True, False)                                         
      If Userfound = True Then
          FrmMAIN.LblUSER.Text = Dbuserid.ToString
          Exit Sub
      End If
      End Sub)

Normal Loop能够找到Dbuserid,而Parallel。用于无法找到Dbuserid。 不确定是否由于语法错误,欢迎任何人突出显示。 预先感谢!

2 个答案:

答案 0 :(得分:0)

您的If语句中的代码引用的是FrmMAIN的默认实例。默认实例是特定于线程的。并行循环的每次迭代都在不同的线程上执行。这意味着每次迭代都指向FrmMAIN的不同实例,而您所要查看的实例都不是。

解决方案的一种选择是将结果分配给循环内的变量,然后在循环后显示该变量的值,在该循环中再次在UI线程上执行代码。

要清楚,“查找”值的代码运行正常。您只是在未显示的表单上显示结果。您需要在正确的表单上显示结果。

答案 1 :(得分:0)

感谢您的输入。

现在一切正常,但我确实注意到实际的总处理时间与正常的For Loop几乎相同或稍长,也许Zkfp.VerFingerFromStr函数是此处的瓶颈,但我不确定。