abd*_*uct 6 c# multithreading http-get
嗨,我有一个函数,传递url获取参数到Web服务器上的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));
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以一次发送所有5个请求而无需等待之前完成?(我正在考虑穿线它,但是我以前从未碰过它,因为我不知道从哪里开始.)
GetResponse()您可以使用BeginGetResponse()哪个非阻塞调用而不是使用该方法.它需要一个回调,然后可以WebResponse在最终返回时处理该对象.链接中的示例将使您了解如何让主线程等待所有响应返回.
以下是使用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);
Run Code Online (Sandbox Code Playgroud)
第二个结果与每个结果有关:
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);
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3063 次 |
| 最近记录: |