none
PROBLEMAS USANDO IAsyncResult RRS feed

  • Pergunta

  • BOM DIA A TODOS! ESPERO QUE POSSAM ME DAR UMA LUZ NUMA MONTAGEM DE PROCESSAMENTO ASSINCRONO.

    VAMOS AO PROBLEMA:

    ESTOU MONTANDO UMA ROTINA PARA APLICAÇÕES MÓVEL, ONDE EU NECESSITO DE CARREGAR ALGUMAS INFORMAÇÕES QUE ESTÃO NUM WEB SERVICE ENTÃO FAÇO A SEGUINTE CHAMADA:

            IAsyncResult vendedores;
            IAsyncResult vendedores_rota;

            //VENDEDORES
             vendedores = wsIntegracao.BeginListagem_Vendedor(strString_conexao, strData_importacao, strData_importacao + ' ' + strHora_importacao, null, DateTime.Now);
                       
            //VENDEDORES ROTA
            vendedores_rota = wsIntegracao.BeginListagem_Vendedor_Cliente(strString_conexao, strCod_vendedor, "20500101", "00:00:00", null, DateTime.Now);

            if (vendedores.IsCompleted == true)
               {
                   if (vendedores_rota.IsCompleted == true)
                     {
                       pbIntegracao_vendedor.Minimum = 0;
                       pbIntegracao_vendedor.Maximum = Convert.ToInt32(wsIntegracao.EndListagem_Vendedor(vendedores).Length) +
                                                                          Convert.ToInt32(wsIntegracao.EndListagem_Vendedor_Cliente(vendedores_rota).Length);           

                        txtStatus_vendedor.Text = "FIM CONSULTA VENDEDOR > " + DateTime.Now.Subtract(dtInicio_Vendedor);
                     }
                     else
                     {
                       txtStatus_vendedor.Text = "*** PROCESSANDO *** " + DateTime.Now.Subtract(dtInicio_Vendedor);
                      }
                    
                 }

    POREM AO INDICAR QUE COMPLETOU A TRANSAÇÃO O MESMO TEM QUE RETORNAR O VALOR DE REGISTROS QUE SE DÁ NO TRECHO QUE ESTA DENTRO DO IF:

                       pbIntegracao_vendedor.Maximum = Convert.ToInt32(wsIntegracao.EndListagem_Vendedor(vendedores).Length) +
                                                                          Convert.ToInt32(wsIntegracao.EndListagem_Vendedor_Cliente(vendedores_rota).Length);           

    ELE RETORNA O ERRO ABAIXO:

    A first chance exception of type 'System.Net.WebException' occurred in System.Web.Services.dll
    'wsIntegracao.EndListagem_Vendedor(vendedores)' threw an exception of type 'System.Net.WebException'

    E UM DETALHE, ESTE ERRO É INTERMITENTE.

    SERÁ QUE ESQUECI DE ALGUMA COISA?

    SE ALGUEM PUDER ME AJUDAR FICO MUITO GRATO.

    segunda-feira, 18 de abril de 2011 13:33

Respostas

Todas as Respostas

  • Boas MUBV,

    E de onde chama esse código? Está se vinculando ao evento que caracteriza o fim da operação?
    http://www.israelaece.com
    segunda-feira, 18 de abril de 2011 13:37
    Moderador
  • chamo de dentro de um evento :

    private void cmdIntegracao_Click(object sender, EventArgs e)

            {}

     

    e o mesmo trecho acima fica dentro de um loop ate que os

    dois obedeçam ao IsCompleted==true

    e  logo após este boloco acima citado, pouco antes de ele dar a volta no loop uso o código abaixo:

    Thread.Sleep(10);

    era isso que perguntou?

     

    segunda-feira, 18 de abril de 2011 13:53
  • Boas MUBV,

    Porque ao invés de fazer um looping, não se vincula ao evento XXXCompleted? Lá, seguramente, ele será disparado somente depois que o serviço retornou.
    http://www.israelaece.com
    segunda-feira, 18 de abril de 2011 14:08
    Moderador
  • TERIA COMO VOCÊ ILUSTRAR PRA MIM O QUE VC SE REFERE QUANDO CITA EVENTO XXXCOMPLETED?

    E VOCÊ ACREDITA QUE ESTE ERRO ESTA SENDO OCASIONADO POIS PRENDO O TRATAMENTO DE RETORNO NO LOOP?

     

    segunda-feira, 18 de abril de 2011 14:13
  • Boas MUBV,

    Talvez sim, talvez não. O problema é que fazendo looping, você deixa seu código síncrono.

    Será que não está sendo disparado alguma exceção no serviço que está danificando o teu cliente?
    http://www.israelaece.com
    segunda-feira, 18 de abril de 2011 14:49
    Moderador
  • VC ACREDITA QUE O JEITO QUE EU ESTOU USANDO É O MELHOR? VC ME RECOMENDARIA ALGUMA OUTRA FORMA DE FAZER?

     

    segunda-feira, 18 de abril de 2011 15:06
  • Boas MUBV,

    Quando você invoca um serviço de forma assíncrona, a finalidade é permite que o cliente possa continuar fazendo outras tarefas enquanto a requisição está sendo processada pelo serviço. Se você coloca aquele código dentro do looping, você está bloqueando o cliente, evitando que ele faça outras coisas.

    Aqui eu mostro um exemplo, mas utilizando WCF: http://www.israelaece.com/post/WCF-Chamadas-Assincronas.aspx
    http://www.israelaece.com
    • Marcado como Resposta MUBV segunda-feira, 18 de abril de 2011 16:20
    segunda-feira, 18 de abril de 2011 16:12
    Moderador