首先,我使用Stephen的WithCancellation扩展来中止ReadStringAsync方法。在内部,这使用TaskCompletionSource和Tasks.WhenAny。这里的详细信息;http://blogs.msdn.com/b/pfxteam/archive/2012/10/05/how-do-i-cancel-non-cancelable-async-operations.aspx
由于Using关键字,异常将被抛出。当End Using被击中时,读取仍在进行,这将处理Response.Content对象的内部流。我知道read仍然在后台运行,只要我的代码能够继续运行,而不需要长时间阅读,我也不介意。
在进行这种读取时,我不确定HttpClient的超时属性是否适用(请求是用HttpCompletionOption.ResponseHeadersRead发出的,所以在读取之前我没有内容)。此外,由于代理错误,我可能遇到了代码卡在读取上的问题,所以我需要能够取消它。
我不明白的是;
无法删除Using块,因为所有HttpReponseMessage对象都包装在Using中,所以当HttpResponseMessage被释放时,我也会遇到同样的问题。
Public Async Function GetResponseStringAsync(Response As HttpResponseMessage) As Tasks.Task(Of String)
Dim TimeoutToken As New CancellationTokenSource
TimeoutToken.CancelAfter(DefaultTimeout)
Try
Using Response.Content
Try
Return Await Response.Content.ReadAsStringAsync.WithCancellation(TimeoutToken.Token).ConfigureAwait(False)
Catch ex As Exception
End Try
End Using
Catch ex As Exception
End Try
Return Nothing
End Function这是抛出的InvalidOperationException的输出。
System.InvalidOperationException: Can not access a closed Stream.
at System.Net.GZipWrapperStream.EndRead(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.EndRead(IAsyncResult asyncResult)
at System.Net.Http.StreamToStreamCopy.BufferReadCallback(IAsyncResult ar)编辑: 72小时后没有任何评论,向上或回答。这个问题有什么问题吗?
发布于 2015-11-15 21:00:29
对Response.Content.ReadAsStringAsync的调用不阻塞。它立即返回(毕竟是异步的),触发对using语句的finally子句中的内容的Dispose调用,从而关闭底层流,从而导致异常。
当尝试读取时,流已经关闭。若要在读取后释放内容,可以使用如下所示的延续:
ContinueWith(t => { response.Content.Dispose(); return t.Result; });希望这能有所帮助。
https://stackoverflow.com/questions/27259488
复制相似问题