none
Cancelar a execução de um método

    Pergunta

  • Pessoal,

     

    Tenho um método que consulta uma informação via internet. Porém, as vezes a resposta do servidor é demorada e acaba travando o processamento de outros métodos. Como poderia cancelar esse método de consulta à internet quando não houver resposta em um determinado espaço de tempo??

    Tentei utilizar um timer, porém sem sucesso!!

     

    Tentarei exemplificar:

     

    private consultar nova_consulta;

    private int soma;

     

    private void contar()

    {

    nova_consulta = new consultar();

    nova_consulta.busca(informacao);    <= nesse ponto o servidor não responde e o sistema pára!!

    soma++;

    }

     

    Alguém pode me ajudar??

    desde já agradeço.

    Flávio

    quinta-feira, 28 de fevereiro de 2008 00:15

Respostas

  • Olá,

     

    Você mesmo está criando o proxy (chamado "consultar" no teu exemplo) para o WebService ou está usando um componente pronto?

     

    Eu pergunto isto porque desde pelo menos o Visual Studio 2003, o gerador de proxies que roda por de baixo do pano quando você adiciona um Web Reference ou um Service Reference pela IDE fornece formas de se fazer as chamadas de forma assíncrona.

    E é nesta parte que está o pulo do gato. A chamada assíncrona permite que o teu código siga adiante enquanto o web service faz o que tem que fazer.

    Agora com relação a cancelar a operação:

    • Numa olhada rápida no 2003 eu não encontrei como cancelar uma operação.
    • No 2005, o gerador de proxy cria um método CancelAsync().
    • No 2008, o gerador de proxy cria um método Abort.

     

    Em todos os casos, o retorno é feito em outra thread.

     

    Se você estiver usando um cliente ASP.NET você pode usar as técnicas descritas em http://msdn2.microsoft.com/en-us/magazine/cc163725.aspx para não bloquear a thread enquanto o web service é executado e não perder o HttpContext.

     

    Eu só recomendo instanciar Threads explicitamente quando a tarefa a ser executada pela thread rodará por um tempo longo indefinido. Caso você tenha que passar um parâmetro, a partir do .NET Framework 2.0 você poderá usar o delegate ParameterizedThreadStart no lugar do ThreadStart .

    Criar threads explicitamente tem um custo relativamente alto, então evite isto num ambiente onde o método seja chamada muitas vezes num curto espaço de tempo.

     

    Caso as tarefas a serem executadas tenham um tempo relativamente curto (alguns minutos, por exemplo), prefira usar o ThreadPool.QueueUserWorkItem. Se a tarefa for levar muito tempo para executar ou não for terminar enquanto durar o processo, evite este método já que ele atrapalhará o mecanismo de pooling de threads - crie uma thread explicitamente.

     

    []

    sábado, 1 de março de 2008 22:16
    Moderador

Todas as Respostas

  •  

    cara, tenta usar uma thread para executar este metodo:

    exemplo

    this.informacao= informacao;

    ThreadStart processo  = new ThreadStart(nova_consulta.busca);

    Thread thread = new Thread(processo);

    thread.IsBackground = false;

    thread.Start();

     

    assim os outros processo irão continuar, atente-se apenas ao fato de que o processo passado em threadstar nao poderá passar parametros.

    sábado, 1 de março de 2008 20:53
  • Olá,

     

    Você mesmo está criando o proxy (chamado "consultar" no teu exemplo) para o WebService ou está usando um componente pronto?

     

    Eu pergunto isto porque desde pelo menos o Visual Studio 2003, o gerador de proxies que roda por de baixo do pano quando você adiciona um Web Reference ou um Service Reference pela IDE fornece formas de se fazer as chamadas de forma assíncrona.

    E é nesta parte que está o pulo do gato. A chamada assíncrona permite que o teu código siga adiante enquanto o web service faz o que tem que fazer.

    Agora com relação a cancelar a operação:

    • Numa olhada rápida no 2003 eu não encontrei como cancelar uma operação.
    • No 2005, o gerador de proxy cria um método CancelAsync().
    • No 2008, o gerador de proxy cria um método Abort.

     

    Em todos os casos, o retorno é feito em outra thread.

     

    Se você estiver usando um cliente ASP.NET você pode usar as técnicas descritas em http://msdn2.microsoft.com/en-us/magazine/cc163725.aspx para não bloquear a thread enquanto o web service é executado e não perder o HttpContext.

     

    Eu só recomendo instanciar Threads explicitamente quando a tarefa a ser executada pela thread rodará por um tempo longo indefinido. Caso você tenha que passar um parâmetro, a partir do .NET Framework 2.0 você poderá usar o delegate ParameterizedThreadStart no lugar do ThreadStart .

    Criar threads explicitamente tem um custo relativamente alto, então evite isto num ambiente onde o método seja chamada muitas vezes num curto espaço de tempo.

     

    Caso as tarefas a serem executadas tenham um tempo relativamente curto (alguns minutos, por exemplo), prefira usar o ThreadPool.QueueUserWorkItem. Se a tarefa for levar muito tempo para executar ou não for terminar enquanto durar o processo, evite este método já que ele atrapalhará o mecanismo de pooling de threads - crie uma thread explicitamente.

     

    []

    sábado, 1 de março de 2008 22:16
    Moderador