Notice: Undefined index: host in C:\Benner\wwwroot\AccessViolation\qa-include\qa-base.php on line 1259
Usar paralelismo no BEF sem necessidade de registrar InteropVclTec - Access Violation
+1 voto
19 visitas

É possível usar o paralelismo do BEF (Tasks) sem precisar ter registrada o binário InteropVclTec? 

Atualmente se a dll não estiver regitrada (regsvr32) ocorre o erro:
 

System.InvalidCastException: Não é possível converter o objeto COM do tipo 'System.__ComObject' na interface tipo 'InteropVcltec.ISQLMonitor'. Esta operação falhou porque a chamada de QueryInterface no componente COM para a interface com IID '{157B8C65-C5E7-4A3E-A899-EFF7A741510A}' falhou devido ao seguinte erro: Não há suporte para esta interface (Exceção de HRESULT: 0x80004002 (E_NOINTERFACE)).
   em System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
   em InteropVcltec.ISQLMonitor.GetEnabled()
   em Benner.Tecnologia.Interop.Vcltec.LegacySqlMonitorImplementation.GetEnabled()
   em Benner.Tecnologia.Application.Services.DataWriter.ManagedDataWriterSource.Benner.Tecnologia.Application.Services.DataWriter.IDataWriterSource.SetCommandText(String commandText)
   em Benner.Tecnologia.Application.EntityService.BusinessTableSourceImplementation.DoUpdate(EntityBase entity)
   em Benner.Tecnologia.Application.EntityService.BusinessTableSourceImplementation.InternalSave(EntityBase entity)
   em Benner.Tecnologia.Application.EntityService.BusinessSourceImplementationBase.Save(EntityBase entity)
   em Benner.Tecnologia.Application.EntityService.BusinessEntityService.InternalSave(EntityBase entity, TransitoryData transitoryData)
   em Benner.Tecnologia.Application.EntityService.BusinessEntityService.Benner.Tecnologia.Common.Services.IEntityService.Save(EntityBase entity, TransitoryData transitoryData)
   em Benner.Tecnologia.Common.EntityBase.DoSave()
   em Benner.Tecnologia.Common.EntityBase.Save()
   em Benner.Tecnologia.Business.BusinessEntity`1.Save()

 

Fonte: http://wiki.benner.com.br/wiki/index.php?title=Paralelismo_no_BEF

por (11 pontos) | 19 visitas
Podes colocar um trecho do seu código?

Claro, segue:

var viagensGeradas = new List < long > ();
var tasksGeracaoViagens = new List < Task < long >> ();

foreach(var handleViagemRoteirizador in listaViagensRoteirizadas) {
  var viagemRoteirizador = RoteirizadorViagem.Get(handleViagemRoteirizador);

  if (viagemRoteirizador.PossuiViagemGerada())
    viagensGeradas.Add(viagemRoteirizador.ViagemGeradaHandle.ToLong());
  else
    tasksGeracaoViagens.Add(GerarViagemRoteirizadaAsync(viagemRoteirizador));
}

//Aguardar o processamento...
AsyncHelper.RunSync(() => Task.WhenAll(tasksGeracaoViagens));

 

private Task < long > GerarViagemRoteirizadaAsync(RoteirizadorViagem viagemRoteirizada) => Task.Run(() => {
  using(_bennerDbContextFactory.NewTaskDbContext()) {
    return GerarViagemRoteirizada(viagemRoteirizada);
  }
}); 

 

 

public long GerarViagemRoteirizada(RoteirizadorViagem viagemRoteirizador) {
    var resultInclusaoDocumentosNaViagem = new List < IncluirDocumentosNaViagemResult > ();

    try {
      VerificaDocumentosPendentes(viagemRoteirizador);

      // Busca os Documentos vinculados na viagem criada pelo roteirizador
      var documentos = RoteirizadorDocumentoRoteirizado.GetDocumentosRoteirizadosByHandleViagem(viagemRoteirizador.Handle);

      using(TransactionContext tc = new TransactionContext()) {
        var viagem = CriarRegistroViagem(viagemRoteirizador, documentos);

        resultInclusaoDocumentosNaViagem = IncluirDocumentosNaViagem(viagem, documentos);

        if (resultInclusaoDocumentosNaViagem.Any(w => w.Falhou))
          throw resultInclusaoDocumentosNaViagem.First(w => w.Falhou).Exception;

        MarcarClientesDosDocumentosComoIntegrados(documentos);

        viagem.GerarAuditoria("Roteirizador", String.Format("Nova Viagem: {0}.", viagem.NumeroViagem), viagem.Handle.Value);

        CriarPontosDeParadaNaViagem(viagem);

        viagemRoteirizador.DefinirComoProcessado(viagem.Handle);

        tc.Complete();

        return viagem.Handle;
      }
    }

A rotina funciona conforme o esperado, em paralelo, desde que InteropVclTec esteja registrada no Windows. 

Entre ou cadastre-se para responder esta pergunta.

Perguntas relacionadas

+2 votos
1 resposta
+2 votos
1 resposta
perguntado 20 Set, 2017 por paulo.larini (79 pontos) | 75 visitas
Melhores Jul 2021
  1. skymiledelta

    9 Pontos

  2. brayden lee

    9 Pontos

  3. Samkaran321

    5 Pontos

  4. james mchel

    5 Pontos

  5. icustomerservice

    5 Pontos

  6. JetblueEspañol

    5 Pontos

  7. airtravelmart

    5 Pontos

  8. vimalkapoorpro

    5 Pontos

  9. heri188

    5 Pontos

  10. marktayler

    5 Pontos

200 pontos
Melhores 2021 Jul 26 - Aug 01
  1. henrique.muller

    28 Pontos

  2. willian.metalsystem

    17 Pontos

  3. Marco.Barros

    12 Pontos

  4. Cesar.Albuquerque

    11 Pontos

  5. skymiledelta

    9 Pontos

  6. robert.metalsystem

    6 Pontos

  7. Samkaran321

    5 Pontos

  8. james mchel

    5 Pontos

  9. icustomerservice

    5 Pontos

  10. JetblueEspañol

    5 Pontos

514 perguntas
494 respostas
357 comentários
589 usuários