public async Task <Resultado <Digital, Falha> > IdentificarAsync(byte[] digitalNaoIdentificacada) { var contextoParaTask = new ContextoTask(_bancoDigitais.ToList(), digitalNaoIdentificacada, _motorBusca); _cancelamentoTask = new CancellationTokenSource(); var token = _cancelamentoTask.Token; var task = await new TaskFactory <Resultado <Digital, Falha> >().StartNew((contextoRecebido) => { var tempoLocalizacao = new Stopwatch(); tempoLocalizacao.Start(); var contexto = contextoRecebido as ContextoTask; var resultado = Resultado <Digital, Falha> .NovaFalha(Falha.Nova(404, "Digital não encontrada")); foreach (var digital in contexto.BancoDigitais) { if (token.IsCancellationRequested) { break; } if (contexto.MotorBusca.IdentificarDigital(contexto.DigitalNaoIdentificacada, digital) is var resultadoIdentificacao && resultadoIdentificacao.EhSucesso) { resultado = resultadoIdentificacao.Sucesso; break; } } tempoLocalizacao.Stop(); return(resultado); }, contextoParaTask, token); return(task); }
public Resultado <Digital, Falha> Executar(IdentificarSocioPorDigitalComando comando) { var tempoIdentificacao = new Stopwatch(); tempoIdentificacao.Start(); if (_identificadoresDeDigital == null) { _identificadoresDeDigital = new ConcurrentBag <ServicoIdentificacaoDigital>(); } if (_identificadoresDeDigital.Count == 0) { if (_configuracoesBiometriaRepositorio.Recuperar(comando.Estacao) is var configuracaoBiometria && configuracaoBiometria.EhFalha) { return(configuracaoBiometria.Falha); } if (_fabricaMotorBuscaBiometrica.CriarMotorDeBuscaBiometrica(configuracaoBiometria.Sucesso.ParceiroSdkDigital) is var motorBusca && motorBusca.EhFalha) { return(motorBusca.Falha); } if (_digitaisRepositorio.RecuperarNumeroTotalDigitais() is var quantidadeDigitais && quantidadeDigitais.EhFalha) { return(quantidadeDigitais.Falha); } var digitaisPorPagina = (quantidadeDigitais.Sucesso / configuracaoBiometria.Sucesso.QuantidadeThreadsIdentificacaoDigital) + configuracaoBiometria.Sucesso.QuantidadeThreadsIdentificacaoDigital; for (int pagina = 1; pagina <= configuracaoBiometria.Sucesso.QuantidadeThreadsIdentificacaoDigital; pagina++) { if (_digitaisRepositorio.RecuperarPagina(pagina, digitaisPorPagina) is var digitais && digitais.EhFalha) { return(digitais.Falha); } if (digitais.Sucesso.Count() > 0) { _identificadoresDeDigital.Add(new ServicoIdentificacaoDigital(motorBusca.Sucesso, digitais.Sucesso)); } } } var digital = Digital.NovaNaoEncontrada(); Parallel.ForEach(_identificadoresDeDigital, async(identificadorDigital, estadoLoop) => { var resultado = await identificadorDigital.IdentificarAsync(comando.Template); if (resultado.EhSucesso) { digital = resultado.Sucesso; estadoLoop.Break(); } }); tempoIdentificacao.Stop(); return(digital.Id == 0 ? Resultado <Digital, Falha> .NovaFalha(Falha.Nova(404, "Digitão não encontrada")) : Resultado <Digital, Falha> .NovoSucesso(digital)); }
public void Devo_Identificar_Digital_No_Banco_Quando_Informo_Template_Existente() { var digitais = _digitaisDataAccessTestes.CarregarDigitaisParaIdentificacao().ToList(); var digitalLida = _digitaisDataAccessTestes.CarregarDigitalEncontrada(); digitais.Add(digitalLida); var resultado = Resultado <Digital, Falha> .NovaFalha(Falha.Nova(404, "")); var tempo = new Stopwatch(); tempo.Start(); foreach (var digital in digitais) { resultado = _sdk.IdentificarDigital(digitalLida.TemplateIso, digital); if (resultado.EhSucesso) { break; } } tempo.Stop(); Assert.IsTrue(tempo.Elapsed.TotalSeconds < 5); Assert.AreEqual(resultado.Sucesso.Id, digitalLida.Id); }