1

我正在通过从独立读取器读取指纹并将它们与数据库中的模板进行比较来创建指纹验证应用程序。读取器带有内置 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.For 找不到 Dbuserid。不确定是不是语法错误。欢迎大家指出。提前致谢!

4

1 回答 1

0

If声明中的代码是指FrmMAIN. 默认实例是线程特定的。并行循环的每次迭代都在不同的线程上执行。这意味着每次迭代都指的是 的不同实例FrmMAIN,没有一个是您正在查看的实例。

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

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

于 2019-07-07T10:38:32.380 回答