.NET cancelar fluxo BeginRead
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
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:
- Faça suas páginas assíncrona. Por ? Como .
- 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:)