Asynchronous WebRequests using C#

血红的双手。 提交于 2019-12-04 06:08:22

Instead of using the GetResponse() method you could use the BeginGetResponse() which is a non-blocking call. It takes a callback that can then handle the WebResponse object when it finally returns. The example in the link will give you a good idea of how to have the main thread wait for all the responses to return.

Here are two approaches which uses the TPL.

The first waits for all the requests to complete before you access any of the results

var runningTasks = new List<Task<string>>();

for (int ii = 0; ii <= 4; ii++)
{
    var wreq = (HttpWebRequest)WebRequest.Create("..." + ii);

    var taskResp = Task.Factory.FromAsync<WebResponse>(wreq.BeginGetResponse, 
                                                    wreq.EndGetResponse, 
                                                    null);
    var taskResult = taskResp.ContinueWith(tsk => new StreamReader(tsk.Result.GetResponseStream()).ReadToEnd().Trim());
    runningTasks.Add(taskResult);
}

Task.WaitAll(runningTasks.ToArray());
IEnumerable<string> results = runningTasks.Select(tsk => tsk.Result);

and the second does something with each result as it comes in:

for (int ii = 0; ii <= 4; ii++)
{
    var wreq = (HttpWebRequest)WebRequest.Create("..." + ii);

    var taskResp = Task.Factory.FromAsync<WebResponse>(wreq.BeginGetResponse, 
                                                    wreq.EndGetResponse, 
                                                    null);
    taskResp.ContinueWith(tsk => new StreamReader(tsk.Result.GetResponseStream()).ReadToEnd().Trim())
            .ContinueWith((Task<string> trs) => 
                { 
                    var result = trs.Result;
                    DoSomthingWithTheResult(result);
                });
}

Instead of GetResponse use BeginGetResonse method of request class. Sample and documentation can be found at http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx

Use WebClient with Async methods.

Begin\End is more difficult to use.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!