微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#异步方法仍然挂起UI

我有这两种方法,我想运行异步以保持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库的第三(和昂贵)选项,以获得体面的吞吐量,但在您的情况下可能会有点极端;

原文地址:https://www.jb51.cc/csharp/96139.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐