我正在开发一个插入到Windows窗体应用的插件,用于在地图上显示终端的位置(在WebBrowser控件中)。情况如下:等待异步HTTP请求的响应,无异步/等待
- 用户单击按钮(调用插件);
- 异步HTTP请求被创建(确定终端的坐标);
- 由于全部收到响应 - 地图应显示给用户。
我写的代码:
foreach (var terminal in terminals)
{
var webRequest = (HttpWebRequest)WebRequest.Create(GeoCoder.GeoCodeUrl + terminal.Address);
var taskResp = Task.Factory.FromAsync<WebResponse>(webRequest.BeginGetResponse,
webRequest.EndGetResponse,
terminal.Id);
var taskResult = taskResp.ContinueWith(task =>
{
// Parse the response
});
runningTasks.Add(taskResult);
}
Task.WaitAll(runningTasks.ToArray()); // UI Thread blocks here!
webBrowser1.DocumentText = ...
它会阻止UI线程,因为我不得不等待,直到我得到所有响应(坐标)之前,我可以显示地图。我想知道如何避免这种情况(没有发出同步http请求)?
P.S.我知道如何使用异步/等待,但不能使用它们 - 我必须使用.NET 4.0和VS2010 - Microsoft.Bcl.Async不能帮助)。
我需要调用'webBrowser1.DocumentText = ...',只要我得到**最后一个响应**。我不明白如何使用'ThreadPool.QueueUserWorkItem'来完成它,请给我更多的细节? – Zharro