.NET 4.x Запуск кода асинхронно - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день господа! Имею следующий класс:
using HtmlAgilityPack;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
 
namespace Warframe_Agent.Classes
{
    public class News
    {
        public string NewsImg { get; set; }
        public string NewsName { get; set; }
        public string NewsTime { get; set; }
        public string NewsURL { get; set; }
 
        public static List<News> ReadNews()
        {
            //Создаем некую библиотеку новостей (List)
            List<News> ItemNews = new List<News>();
            List<string> names = new List<string>();
            List<string> dates = new List<string>();
            List<string> images = new List<string>();
            List<string> urls = new List<string>();
 
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(getRequest("https://warframe.com/ru/news-categories/pc"));
            HtmlNodeCollection name_count = doc.DocumentNode.SelectNodes("//div[@class='body']");
            HtmlNodeCollection date_count = doc.DocumentNode.SelectNodes("//div[@class='date']");
            HtmlNodeCollection image_count = doc.DocumentNode.SelectNodes("//div[@class='image']//img");
            HtmlNodeCollection url_count = doc.DocumentNode.SelectNodes("//div[@class='image']//@href");
 
            if (name_count != null)
            {
                foreach (HtmlNode nameIn in name_count)
                    names.Add(nameIn.InnerText);
            }
 
            if (date_count != null)
            {
                foreach (HtmlNode dateIn in date_count)
                {
                    dates.Add(dateIn.InnerText.Remove(18));
                }
            }
 
            if (image_count != null)
            {
                foreach (HtmlNode imgIn in image_count)
                {
                    images.Add(imgIn.Attributes["src"].Value);
                }
            }
 
            if (url_count != null)
            {
                foreach (HtmlNode urlIn in url_count)
                {
                    urls.Add(urlIn.Attributes["href"].Value);
                }
            }
 
            for (int i = 0; i < images.Count; i++)
            {
                ItemNews.Add(new News() { NewsImg = images[i], NewsName = names[i], NewsTime = dates[i], NewsURL = "https://warframe.com" + urls[i] });
            }
 
            return ItemNews;
        }
 
        public static string getRequest(string url)
        {
            try
            {
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.AllowAutoRedirect = false;//Запрещаем автоматический редирект
                httpWebRequest.Method = "GET"; //Можно не указывать, по умолчанию используется GET.
                httpWebRequest.Referer = "http://google.com"; // Реферер. Тут можно указать любой URL
                using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
                {
                    using (var stream = httpWebResponse.GetResponseStream())
                    {
                        using (var reader = new StreamReader(stream, Encoding.GetEncoding(httpWebResponse.CharacterSet)))
                        {
                            return reader.ReadToEnd();
                        }
                    }
                }
            }
            catch
            {
                return string.Empty;
            }
        }
    }
}
Данный класс парсит нужную Web страницу и необходимые данные передает в List<News>. Сам List<News> в последующем загружается в ListBox WPF NewsLb.ItemsSource = News.ReadNews(); Все работает, все загружает. Но вот незадача - пока программа прогружает нужную страницу, программа висит! Пытался по разному переделать данный код в асинхронный, но безрезультатно! Прошу вашей помощи по оптимизации и запуску асинхронно данный кусок программы!

Решение задачи: «.NET 4.x Запуск кода асинхронно»

textual
Листинг программы
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
 
/*
<?xml version="1.0" encoding="utf-8"?>
<response list="true">
 <user>
  <id>1</id>
  <first_name>Павел</first_name>
  <last_name>Дуров</last_name>
 </user>
</response>
*/
 
namespace GetXmlFromVk
{
    class User
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
 
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            textBoxOutput.ScrollBars = ScrollBars.Both;
            textBoxOutput.WordWrap = false;
        }
 
        private async void buttonGetXmlFromVk_Click(object sender, EventArgs e)
        {
            buttonGetXmlFromVk.Enabled = false;
            await GetXmlFromVk();
            buttonGetXmlFromVk.Enabled = true;
        }
 
        private async Task GetXmlFromVk()
        {
            using (var client = new HttpClient())
            {
                var resp = await client.GetStringAsync("https://api.vk.com/method/users.get.xml?user_id=1&v=5.45");
 
                XDocument xmlDoc = XDocument.Parse(resp);
 
                var query = from user in xmlDoc.Descendants("user")
                            select new User
                            {
                                Id = (int)user.Element("id"),
                                FirstName = user.Element("first_name").Value.ToString(),
                                LastName = user.Element("last_name").Value.ToString()
                            };
 
                foreach (var user in query)
                {
                    textBoxOutput.Text += user.FirstName + " " + user.LastName;
                }
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5