Пропущено 675 кадров! Приложение может выполнять слишком много работы в своем основном потоке. Как заставить приложение работать в фоновом режиме без зависания интерфейса? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть агрегатор новостей, и в отладке у меня есть следующее: Пропущено 675 кадров! Приложение может выполнять слишком много работы в своем основном потоке. Я загружаю только с 12 сайтов. Есть ли способ сделать всю эту загрузку в фоновом режиме без остановки всего приложения?

РЕДАКТИРОВАТЬ: метод для получения одной новости

public async static Task<NewsContent> oneNews(string category,string site)
    {
        if(sites.Count==0)
            addElements();

        GetNews gn = new GetNews(site,false);
        Random rn = new Random();

        var s = await gn.news(rn.Next(0,2));
        return s;
    }

Класс GetNews:

class GetNews
{

    string url;
    bool isMultiple;
    public GetNews(string url,bool isMultiple)
    {
        this.url = url;
        this.isMultiple = isMultiple;
    }


    public async Task<NewsContent> news(int i)
    {
        List<NewsContent> feedItemsList = new List<NewsContent>();

        try
        {
            WebRequest webRequest = WebRequest.Create(url);
            WebResponse webResponse = webRequest.GetResponse();
            Stream stream = webResponse.GetResponseStream();
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(stream);
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);
            nsmgr.AddNamespace("dc", xmlDocument.DocumentElement.GetNamespaceOfPrefix("dc"));
            nsmgr.AddNamespace("content", xmlDocument.DocumentElement.GetNamespaceOfPrefix("content"));
            XmlNodeList itemNodes = xmlDocument.SelectNodes("rss/channel/item");
            NewsContent feedItem = new NewsContent();

                if (itemNodes[i].SelectSingleNode("title") != null)
                {
                    feedItem.title = itemNodes[i].SelectSingleNode("title").InnerText;
                }
                if (itemNodes[i].SelectSingleNode("link") != null)
                {
                    feedItem.url = itemNodes[i].SelectSingleNode("link").InnerText;
                }
                if (itemNodes[i].SelectSingleNode("pubDate") != null)
                {
                    var time = itemNodes[i].SelectSingleNode("pubDate").InnerText;
                    feedItem.time = getHour(time);
                }
                if (itemNodes[i].SelectSingleNode("description") != null)
                {
                    feedItem.desc = itemNodes[i].SelectSingleNode("description").InnerText;

                }
                if (itemNodes[i].SelectSingleNode("content:encoded", nsmgr) != null)
                {
                    feedItem.content = itemNodes[i].SelectSingleNode("content:encoded", nsmgr).InnerText;
                }
                else
                {
                    feedItem.content = feedItem.desc;
                }
                feedItem.imageURL = getImage(feedItem.content);


                var sourcename = url.Split(new[] { "//" }, StringSplitOptions.None)[1];
                feedItem.newsSource = sourcename.Split(new[] { "/" }, StringSplitOptions.None)[0];
                if (feedItem.content.Contains("<p>"))
                {
                    var shortContent = feedItem.content.Split(new[] { "<p>" }, StringSplitOptions.None)[1];
                    string finalShortContent = "";
                    for (int ii = 0; ii < shortContent.Length; ii++)
                    {
                        if (ii > 200 && shortContent[ii].Equals(' '))
                            break;
                        while (shortContent[ii].Equals('<') || shortContent[ii].Equals('p') || shortContent[ii].Equals('/') || shortContent[ii].Equals('>'))
                            ii++;
                        try
                        {
                            finalShortContent += shortContent[ii];
                        }
                        catch (Exception e)
                        {
                            break;
                        }
                    }
                    finalShortContent += "...";
                    feedItem.shortcontent = finalShortContent;
                }
            return feedItem;
        }
        catch (Exception e)
        {
            return null;
        }

    }
    string getImage(string full)
    {
        try
        {
            var code = full.Split(new[] { "src=\"" }, StringSplitOptions.None)[1];
            var fin = code.Split(new[] { "\"" }, StringSplitOptions.None)[0];
            return fin;
        }
        catch(Exception e)
        {
            return null;
        }
    }
    List<int> getHour(string full)
    {
        try
        {
            List<int> smh = new List<int>();
            var ph = full.Split(new[] { "2020 " }, StringSplitOptions.None)[1];
            var hour = ph.Split(new[] { ":" }, StringSplitOptions.None);
            smh.Add(Int32.Parse(hour[0]));
            smh.Add(Int32.Parse(hour[1]));
            var second = hour[2].Split(new[] { " " }, StringSplitOptions.None)[0];
            smh.Add(Int32.Parse(second));
            return smh;
        }catch(Exception)
        {
            return null;
        }
    }
}

1 Ответ

0 голосов
/ 23 апреля 2020

Попробуйте это. Стоит поставить функцию в другой поток

await Task.Run(async () =>
                    {
                        //function
                    });
...