2016-03-25 66 views
2

我想打破Verification(IAsyncResult r)status == NBiometricStatus.Ok但我這個代碼不破我的循環,所以請您幫我...如何打破IAsyncResult?

private void OnCapturingCompleted(IAsyncResult r) 
    { 
     var enrollTask = new NBiometricTask(NBiometricOperations.Enroll); 

     try 
     { 
      if (InvokeRequired) 
      { 
       BeginInvoke(new AsyncCallback(OnCapturingCompleted), r); 
      } 
      else 
      { 
       NBiometricStatus status = _mbiometricClient.EndCapture(r); 
       // If Stop button was pushed 
       if (status == NBiometricStatus.Canceled) return; 

       M_lblStatus.Text = status.ToString(); 
       if (status != NBiometricStatus.Ok) 
       { 
        _mbiometricClient.ForceStart(); 

       } 
       else 
       { 
        DataTable dt = QueryMaster.GetFaceData(); 


        for (int i = 0; i < dt.Rows.Count; i++) 
        { 
         byte[] b1 = System.Convert.FromBase64String(dt.Rows[i]["F_feature"].ToString()); 
         _Rsubject = new NSubject(); 
         _Rsubject.SetTemplateBuffer(NBuffer.FromArray(b1)); 

         if (_subject != null && _Rsubject != null) 
         { 
          _mbiometricClient.BeginVerify(_subject, _Rsubject, Verification, null); 
          if (result != null) 
          {         
           break; 
          } 
         } 

        } 
       } 
      } 
     } 
     catch (Exception ex) { } 
     finally 
     { 
         } 

    } 

    private void Verification(IAsyncResult r) 
    { 
     string msg; 
     try 
     { 
      if (InvokeRequired) 
      { 
       BeginInvoke(new AsyncCallback(Verification), r); 
      } 
      else 
      { 
       try 
       #region foreloop 
       { 

        foreach (NMatchingResult t in _subject.MatchingResults) 
        { 
         NBiometricStatus status = _mbiometricClient.EndVerify(r); 
         var verificationStatus = string.Format("Verification status: {0}", status); 
         if (status == NBiometricStatus.Ok) 
         { 
          //get matching score 
          int score = _subject.MatchingResults[0].Score; 
          msg = string.Format("Score of matched templates: {0}", score); 
          msg += " " + verificationStatus; 
          lblFinalStatus.Text = msg; 
          //MessageBox.Show(msg); 
          result = msg; 
          //EndInvoke(r); 
          Func<string> function = r.AsyncState as Func<string>; 
          msg = function.EndInvoke(r);        

          break; 
         } 
         else 
         { 
          lblFinalStatus.Text = verificationStatus; 
          count += 1; 
          if (count == 10) 
          { 
           MessageBox.Show(string.Format("{0}\n{1}", verificationStatus, "Face doesn't Exist..!")); 
          } 
          _mbiometricClient.ForceStart(); 
         } 
        } 

       } 
       catch (Exception ex) 
       { 
        Utils.ShowException(ex); 
       } 
       #endregion 

      } 
      if (result != null) 
      { 

       Func<string> function = r.AsyncState as Func<string>; 
       msg = function.EndInvoke(r); 
      } 
     } 
     catch (Exception ex) { } 


    } 

這是我EndVerify()

public NBiometricStatus EndVerify(IAsyncResult asyncResult); 

這是我BeginVerify()

public IAsyncResult BeginVerify(NSubject subject, AsyncCallback callback, object state); 

回答

0

請檢查_mbiometricClient.EndVerify(r);已經返回結果執行。看起來EndVerify仍然在if語句中檢查status期間運行。它可能是你沒有收到任務的結果。我的回答是基於EndVerify是異步的假設。

+0

是的。在我的代碼中,如果我們在DataBase中只有一條記錄,那麼這段代碼運行良好,但是當我在第二個函數Verification(IAsyncResult r)中有多條記錄時,我們得到正確的結果。 –

+0

當狀態變好時應該停止。但這不是在我的這段代碼中發生的。 –

+0

我的另一個問題是EndVerify運行異步? –