我有这两种方法,我想运行异步以保持UI响应.但是,它仍然挂在UI上.有什么建议么?
async void DoScrape() { var Feed = new Feed(); var results = await Feed.GetList(); foreach (var itemObject in results) { var item = new ListViewItem(itemObject.Title); item.SubItems.Add(itemObject.Link); item.SubItems.Add(itemObject.Description); LstResults.Items.Add(item); } } public class Feed { async public Task<List<ItemObject>> GetList() { var client = new WebClient(); string content = await client.DownloadStringTaskAsync(new Uri("anyUrl")); var lstItemObjects = new List<ItemObject>(); var Feed = new XmlDocument(); Feed.LoadXml(content); var nodes = Feed.GetElementsByTagName("item"); foreach (XmlNode node in nodes) { var tmpItemObject = new ItemObject(); var title = node["title"]; if (title != null) tmpItemObject.Title = title.InnerText; var link = node["link"]; if (link != null) tmpItemObject.Link = link.InnerText; var description = node["description"]; if (description != null) tmpItemObject.Description = description.InnerText; lstItemObjects.Add(tmpItemObject); } return lstItemObjects; } }
解决方法
我怀疑DownloadStringTaskAsync依赖于较低级别的
HttpWebRequest.BeginGetResponse
.在这种情况下,已知Web请求的设置不是完全异步的.令人沮丧(坦率地说,愚蠢地)异步WebRequest的DNS查找阶段是同步执行的,因此是阻止.我怀疑这可能是你正在观察的问题.
以下转载文档中的警告:
07001
你有两个选择:
>从工作线程启动请求(并且在高负载下,由于阻塞行为而导致ThreadPool的饥饿风险)
(严格)在触发请求之前执行编程DNS查找.这可以异步地完成.希望该请求将使用缓存的DNS查找.
我们去了实现我们自己的正确异步HTTP库的第三(和昂贵)选项,以获得体面的吞吐量,但在您的情况下可能会有点极端;