C# WebRequest.BeginGetResponse-“网络请求”;异步回调";非空洞法中的目标
我需要异步调用HttpWebRequest,问题是BeginGetResponse方法的第一个参数AsyncCallback指向具有无效签名的方法C# WebRequest.BeginGetResponse-“网络请求”;异步回调";非空洞法中的目标,c#,asynchronous,httpwebrequest,C#,Asynchronous,Httpwebrequest,我需要异步调用HttpWebRequest,问题是BeginGetResponse方法的第一个参数AsyncCallback指向具有无效签名的方法 WebRequest _webRequest; private void StartWebRequest() { _webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null); } 我需要使用流返回类型作为目标方法。大
WebRequest _webRequest;
private void StartWebRequest()
{
_webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
}
我需要使用流返回类型作为目标方法。大概是这样的:
private Stream FinishWebRequest(IAsyncResult result)
{
var response= _webRequest.EndGetResponse(result);
using (var stream = response.GetResponseStream())
{
Byte[] buffer = new Byte[response.ContentLength];
int offset = 0, actuallyRead = 0;
do
{
actuallyRead = stream.Read(buffer, offset, buffer.Length - offset);
offset += actuallyRead;
}
while (actuallyRead > 0);
return new MemoryStream(buffer);
}
}
我怎样才能做到这一点呢?基本上你做不到。那不可能是你的回电。此外,将其作为回调是没有意义的,因为实际上没有任何东西可以使用返回的流。一旦启动回调,您打算如何处理流 创建一个只调用
FinishWebRequest
方法的回调非常简单,但这会丢弃流,不会让您有更好的结果
(就我个人而言,顺便说一句,我不会依赖ContentLength——它并不总是设置好的。我只会保留一个小的缓冲区,让你读入,然后直接写入内存流。如果你使用的是.NET 4,你可以使用新方法使生活更轻松。另外,WebResponse
实现IDisposable
,因此你应该有一个using
也有这样的说法。)