Pergunta

Eu não tenho sido capaz de encontrar uma maneira de cancelar / cancelar operação de leitura assíncrona após a bem sucedida HttpWebRequest. Não há maneira de definir tempo limite, ThreadPool.RegisterWaitForSingleObject não está funcionando também. E fechando o soquete subjacente não é uma opção também porque nem HttpWebRequest / Reponse fornecer acesso a ele.

Editar:

Infelizmente esta abordagem que Ensolarado suggestet funciona apenas para HttpWebRequest.BeginGetResponse. Para o fluxo que você começa após GetResponseStream () por algum motivo RegisterWaitForSingleObject não está funcionando - a chamada de retorno nunca é chamado.

A situação é a seguinte: Eu tenho um aplicativo que usa HttpGetRequest. É compilação usando o exemplo MSDN padrão para assíncrono httpwebrequest. Obtendo resposta é trabalhar como um encanto. Mas em raras ocasiões, o servidor que meu httpwebrequest está se conectando a se esquece de fechar o socket. Então, eu estou pendurado em uma leitura infinita de BeginRead.

Em algumas raras ocasiões, o outro servidor esquecer

Foi útil?

Solução

Por que não RegisterWaitForSingleObject? Você pode usá-lo para o tempo fora, e no manipulador você pode chamar request.Abort ().

Aqui está um exemplo . Btw, eu usei abordagem simial antes que eu encontrei este artigo no passado, e funcionou como um encanto.

NOTA: O fim real da operação vai acontecer na próxima Stream.Read (de apenas o pedido / resposta foi assíncrona) ou Stream.EndRead (se a leitura é assíncrono também). Você ainda precisa capturar a exceção lançada no manipulador EndXXXX.

EDIT: Se o RegisterWaitForSingleObject nunca se chamou, então você tem uma outra questão, que é provavelmente um ThreadPool não ter suficientes threads livres. O retorno de chamada para RegisterWaitForSingle objeto é chamado em um segmento ThreadPool, e se não houver um fio livre na piscina, nunca será chamado. Você tem algumas soluções:

  1. Faça suas páginas assíncrona. Por ? Como .
  2. Altere o tópicos max na piscina .

Em qualquer caso, o aumento do tamanho da piscina não vai ajudá-lo muito. Você tem que inspecionar seu código para recursos (stream) vazamentos, e certifique-se que você não só chamar request.Abort (), mas também próximo a resposta. Certifique-se de que em seus retornos de chamada você usar o método EndXXX adequada, etc.

Eu Nazdrave:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top