.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; } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д