.NET 4.x Запуск кода асинхронно - C#
Формулировка задачи:
Добрый день господа!
Имею следующий класс:
Данный класс парсит нужную Web страницу и необходимые данные передает в List<News>.
Сам List<News> в последующем загружается в ListBox WPF NewsLb.ItemsSource = News.ReadNews();
Все работает, все загружает. Но вот незадача - пока программа прогружает нужную страницу, программа висит!
Пытался по разному переделать данный код в асинхронный, но безрезультатно!
Прошу вашей помощи по оптимизации и запуску асинхронно данный кусок программы!
Листинг программы
- 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;
- }
- }
- }
- }
Решение задачи: «.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;
- }
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д