Конвертировать For Loop в Parallel.For для сравнения данных не работает - PullRequest
1 голос
/ 07 июля 2019

Я создаю приложение для проверки отпечатков пальцев, считывая отпечатки пальцев из автономного считывателя и сравнивая их с шаблоном из базы данных. Читатель поставляется со встроенным 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)

Обычный цикл может найти Dbuserid, в то время как Parallel.For не может найти Dbuserid. Не уверен, что это из-за синтаксической ошибки. Любой желающий может выделить. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

спасибо за ваш вводздесь, но я не уверен.

0 голосов
/ 07 июля 2019

Код в вашем операторе If ссылается на экземпляр по умолчанию FrmMAIN. По умолчанию экземпляры зависят от потока. Каждая итерация вашего параллельного цикла выполняется в другом потоке. Это означает, что каждая итерация ссылается на отдельный экземпляр FrmMAIN, ни один из которых не является тем, на который вы смотрите.

Один из вариантов решения - присвоить результат переменной внутри цикла, а затем отобразить значение этой переменной после цикла, где код снова выполняется в потоке пользовательского интерфейса.

Чтобы было понятно, код для "поиска" значения работает отлично. Вы просто отображаете результат в форме, которую вы не отображали. Вам необходимо отобразить результат в правильной форме.

...