6

嗨,我有一个函数可以将 url Get 参数传递给网络服务器上的 php 文件并等待来自文件的响应(通常需要 10-20 秒)。我想把它放在一个循环中,因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件,但是当我尝试将它添加到循环中时,该函数使循环等待文件返回响应,然后它才会去到下一个。

    public string HttpGet(string URI, string Parameters)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URI + Parameters);

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader resStream = new StreamReader(response.GetResponseStream());
          return resStream.ReadToEnd().Trim();
    }

    private void SendCommand()
    {
        for( int i = 0; i <= 4; i++)
        {
            AddRTB(HttpGet(url, paramater));
        }
    }

有没有一种方法可以一次发送所有 5 个请求而无需等待前一个请求完成?(我正在考虑穿线,但可惜我以前从未接触过它,因为我不知道从哪里开始。)

4

4 回答 4

9

这里有两种使用 TPL 的方法。

第一个等待所有请求完成,然后再访问任何结果

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);

第二个对每个结果做一些事情:

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);
                });
}
于 2010-09-26T21:37:57.993 回答
9

GetResponse()您可以使用BeginGetResponse()非阻塞调用而不是使用方法。它需要一个回调,然后可以在WebResponse对象最终返回时处理该对象。链接中的示例将让您很好地了解如何让主线程等待所有响应返回。

于 2010-09-26T18:40:15.340 回答
1

使用请求类的 BeginGetResonse 方法代替 GetResponse。示例和文档可在http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx找到

于 2010-09-26T18:44:23.763 回答
0

WebClient与 Async 方法一起使用。

Begin\End 更难使用。

于 2010-09-26T18:58:08.610 回答