C#异步方法仍然挂起UI

前端之家收集整理的这篇文章主要介绍了C#异步方法仍然挂起UI前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这两种方法,我想运行异步以保持UI响应.但是,它仍然挂在UI上.有什么建议么?
  1. async void DoScrape()
  2. {
  3. var Feed = new Feed();
  4.  
  5. var results = await Feed.GetList();
  6. foreach (var itemObject in results)
  7. {
  8. var item = new ListViewItem(itemObject.Title);
  9. item.SubItems.Add(itemObject.Link);
  10. item.SubItems.Add(itemObject.Description);
  11. LstResults.Items.Add(item);
  12. }
  13. }
  14.  
  15.  
  16. public class Feed
  17. {
  18. async public Task<List<ItemObject>> GetList()
  19. {
  20. var client = new WebClient();
  21. string content = await client.DownloadStringTaskAsync(new Uri("anyUrl"));
  22. var lstItemObjects = new List<ItemObject>();
  23. var Feed = new XmlDocument();
  24. Feed.LoadXml(content);
  25. var nodes = Feed.GetElementsByTagName("item");
  26.  
  27. foreach (XmlNode node in nodes)
  28. {
  29. var tmpItemObject = new ItemObject();
  30. var title = node["title"];
  31. if (title != null) tmpItemObject.Title = title.InnerText;
  32. var link = node["link"];
  33. if (link != null) tmpItemObject.Link = link.InnerText;
  34. var description = node["description"];
  35. if (description != null) tmpItemObject.Description = description.InnerText;
  36. lstItemObjects.Add(tmpItemObject);
  37. }
  38. return lstItemObjects;
  39. }
  40. }

解决方法

我怀疑DownloadStringTaskAsync依赖于较低级别的 HttpWebRequest.BeginGetResponse.在这种情况下,已知Web请求的设置不是完全异步的.令人沮丧(坦率地说,愚蠢地)异步WebRequest的DNS查找阶段是同步执行的,因此是阻止.我怀疑这可能是你正在观察的问题.

以下转载文档中的警告:

07001

你有两个选择:

>从工作线程启动请求(并且在高负载下,由于阻塞行为而导致ThreadPool的饥饿风险)
(严格)在触发请求之前执行编程DNS查找.这可以异步地完成.希望该请求将使用缓存的DNS查找.

我们去了实现我们自己的正确异步HTTP库的第三(和昂贵)选项,以获得体面的吞吐量,但在您的情况下可能会有点极端;

猜你在找的C#相关文章