C# WebRequest-为多个请求异步检索数据
代码不完整(未生成),因为我无法在writeResponseTA()中获取下一行中的“项” 我一定错过了什么。请指出 以下是完整的代码:-C# WebRequest-为多个请求异步检索数据,c#,asynchronous,httpwebrequest,webrequest,C#,Asynchronous,Httpwebrequest,Webrequest,代码不完整(未生成),因为我无法在writeResponseTA()中获取下一行中的“项” 我一定错过了什么。请指出 以下是完整的代码:- static string[] imageUris = { "http://www.cricinfo.com/db/PICTURES/CMS/118200/118217.2.jpg", "http://www.cricinfo.com/db/PICTURES/CMS/117500/117599.2.jpg",
static string[] imageUris =
{ "http://www.cricinfo.com/db/PICTURES/CMS/118200/118217.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/117500/117599.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/117500/117598.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/106400/106412.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/106400/106411.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/106200/106275.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/106300/106362.2.jpg"
};
static void Main(string[] args)
{
SendAsynchronousRequests();
Console.WriteLine("All the files have been requested and retrieved...");
Console.ReadLine();
}
static void SendAsynchronousRequests()
{
WebRequest[] requests = InitializeWebRequests();
foreach (var item in requests)
{
Console.WriteLine("Trying to retrieve :-" + item.RequestUri.OriginalString);
item.BeginGetResponse
(
WriteResponseData,
);
}
}
static WebRequest[] InitializeWebRequests()
{
WebRequest[] requests = new WebRequest[imageUris.Length];
int temp = 0;
foreach (var item in imageUris)
{
requests[temp] = WebRequest.Create(item);
//requests[temp].Method = "GET";
temp++;
}
return requests;
}
static void WriteResponseData(IAsyncResult result)
{
HttpWebResponse WebResp = (HttpWebResponse)item.EndGetResponse(result);
Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
Console.WriteLine("WebResp.Server :- " + WebResp.Server);
Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
Console.WriteLine(Environment.NewLine);
}
编辑
因此,该方法(将编译)的修改代码如下:-
WebRequest request = (WebRequest)result.AsyncState;
if (result != null && result.IsCompleted)
{
HttpWebResponse WebResp = (HttpWebResponse)request.EndGetResponse(result);
Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
Console.WriteLine("WebResp.Server :- " + WebResp.Server);
Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
Console.WriteLine(Environment.NewLine);
}
item.BeginGetResponse
(
WriteResponseData, null
);
它给出了以下运行时错误:-
对象引用未设置为
对象的实例。在
WebRequestUsingAppm.Program.WriterResponseTA(IAsyncResult
结果)在
\webrequestusingaam\Program.cs:第73行
在
System.Net.LazyAsyncResult.Complete(IntPtr
用户令牌)在
System.Net.ContextawarerResult.CompleteCallback(对象
国家)在
System.Threading.ExecutionContext.Run(ExecutionContext
executionContext,ContextCallback
回调,对象状态,布尔值
ignoreSyncCtx)在
System.Threading.ExecutionContext.Run(ExecutionContext
executionContext,ContextCallback
回调,对象状态)在
System.Net.ContextAwareResult.Complete(IntPtr
用户令牌)在
System.Net.LazyAsyncResult.ProtectedInvokeCallback(对象
结果,IntPtr userToken)位于
System.Net.HttpWebRequest.ProcessResponse()
编辑:-
我明白了。result.AsyncState返回null,因为我在调用BeginGetResponse()时传递null,第二个参数是AsyncState,我在那里传递null。我应该在那里传递当前的WebRequest对象,这样就可以了 因此,与其说:-
WebRequest request = (WebRequest)result.AsyncState;
if (result != null && result.IsCompleted)
{
HttpWebResponse WebResp = (HttpWebResponse)request.EndGetResponse(result);
Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
Console.WriteLine("WebResp.Server :- " + WebResp.Server);
Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
Console.WriteLine(Environment.NewLine);
}
item.BeginGetResponse
(
WriteResponseData, null
);
我应该通过这个项目:-
item.BeginGetResponse
(
WriteResponseData, item
);
正如您所说,这段代码不会编译,因为WriteResponse方法不会引用item对象。调用begin request时,可以使用传递请求对象作为状态。请参阅MSDN 编辑:简化的代码模板将是
item.BeginGetResponse(WriteResponseData, item);
并将writeResponda修改为
static void WriteResponseData(IAsyncResult result)
{
WebRequest request = (WebRequest)result.AsyncState;
WebResponse response = request.EndGetResponse(result);
....
}
我明白了。result.AsyncState返回null,因为我在调用BeginGetResponse()时传递null,第二个参数是AsyncState,我在那里传递null。我应该在那里传递当前的WebRequest对象,这样就可以了。谢谢