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

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

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

Добрый день господа! Имею следующий класс:
Листинг программы
  1. using HtmlAgilityPack;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.Text;
  6. namespace Warframe_Agent.Classes
  7. {
  8. public class News
  9. {
  10. public string NewsImg { get; set; }
  11. public string NewsName { get; set; }
  12. public string NewsTime { get; set; }
  13. public string NewsURL { get; set; }
  14. public static List<News> ReadNews()
  15. {
  16. //Создаем некую библиотеку новостей (List)
  17. List<News> ItemNews = new List<News>();
  18. List<string> names = new List<string>();
  19. List<string> dates = new List<string>();
  20. List<string> images = new List<string>();
  21. List<string> urls = new List<string>();
  22. HtmlDocument doc = new HtmlDocument();
  23. doc.LoadHtml(getRequest("https://warframe.com/ru/news-categories/pc"));
  24. HtmlNodeCollection name_count = doc.DocumentNode.SelectNodes("//div[@class='body']");
  25. HtmlNodeCollection date_count = doc.DocumentNode.SelectNodes("//div[@class='date']");
  26. HtmlNodeCollection image_count = doc.DocumentNode.SelectNodes("//div[@class='image']//img");
  27. HtmlNodeCollection url_count = doc.DocumentNode.SelectNodes("//div[@class='image']//@href");
  28. if (name_count != null)
  29. {
  30. foreach (HtmlNode nameIn in name_count)
  31. names.Add(nameIn.InnerText);
  32. }
  33. if (date_count != null)
  34. {
  35. foreach (HtmlNode dateIn in date_count)
  36. {
  37. dates.Add(dateIn.InnerText.Remove(18));
  38. }
  39. }
  40. if (image_count != null)
  41. {
  42. foreach (HtmlNode imgIn in image_count)
  43. {
  44. images.Add(imgIn.Attributes["src"].Value);
  45. }
  46. }
  47. if (url_count != null)
  48. {
  49. foreach (HtmlNode urlIn in url_count)
  50. {
  51. urls.Add(urlIn.Attributes["href"].Value);
  52. }
  53. }
  54. for (int i = 0; i < images.Count; i++)
  55. {
  56. ItemNews.Add(new News() { NewsImg = images[i], NewsName = names[i], NewsTime = dates[i], NewsURL = "https://warframe.com" + urls[i] });
  57. }
  58. return ItemNews;
  59. }
  60. public static string getRequest(string url)
  61. {
  62. try
  63. {
  64. var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
  65. httpWebRequest.AllowAutoRedirect = false;//Запрещаем автоматический редирект
  66. httpWebRequest.Method = "GET"; //Можно не указывать, по умолчанию используется GET.
  67. httpWebRequest.Referer = "http://google.com"; // Реферер. Тут можно указать любой URL
  68. using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
  69. {
  70. using (var stream = httpWebResponse.GetResponseStream())
  71. {
  72. using (var reader = new StreamReader(stream, Encoding.GetEncoding(httpWebResponse.CharacterSet)))
  73. {
  74. return reader.ReadToEnd();
  75. }
  76. }
  77. }
  78. }
  79. catch
  80. {
  81. return string.Empty;
  82. }
  83. }
  84. }
  85. }
Данный класс парсит нужную Web страницу и необходимые данные передает в List<News>. Сам List<News> в последующем загружается в ListBox WPF NewsLb.ItemsSource = News.ReadNews(); Все работает, все загружает. Но вот незадача - пока программа прогружает нужную страницу, программа висит! Пытался по разному переделать данный код в асинхронный, но безрезультатно! Прошу вашей помощи по оптимизации и запуску асинхронно данный кусок программы!

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

textual
Листинг программы
  1. using System;
  2. using System.Linq;
  3. using System.Net.Http;
  4. using System.Threading.Tasks;
  5. using System.Windows.Forms;
  6. using System.Xml.Linq;
  7.  
  8. /*
  9. <?xml version="1.0" encoding="utf-8"?>
  10. <response list="true">
  11.  <user>
  12.   <id>1</id>
  13.   <first_name>Павел</first_name>
  14.   <last_name>Дуров</last_name>
  15.  </user>
  16. </response>
  17. */
  18.  
  19. namespace GetXmlFromVk
  20. {
  21.     class User
  22.     {
  23.         public int Id { get; set; }
  24.         public string FirstName { get; set; }
  25.         public string LastName { get; set; }
  26.     }
  27.  
  28.     public partial class Form1 : Form
  29.     {
  30.         public Form1()
  31.         {
  32.             InitializeComponent();
  33.  
  34.             textBoxOutput.ScrollBars = ScrollBars.Both;
  35.             textBoxOutput.WordWrap = false;
  36.         }
  37.  
  38.         private async void buttonGetXmlFromVk_Click(object sender, EventArgs e)
  39.         {
  40.             buttonGetXmlFromVk.Enabled = false;
  41.             await GetXmlFromVk();
  42.             buttonGetXmlFromVk.Enabled = true;
  43.         }
  44.  
  45.         private async Task GetXmlFromVk()
  46.         {
  47.             using (var client = new HttpClient())
  48.             {
  49.                 var resp = await client.GetStringAsync("https://api.vk.com/method/users.get.xml?user_id=1&v=5.45");
  50.  
  51.                 XDocument xmlDoc = XDocument.Parse(resp);
  52.  
  53.                 var query = from user in xmlDoc.Descendants("user")
  54.                             select new User
  55.                             {
  56.                                 Id = (int)user.Element("id"),
  57.                                 FirstName = user.Element("first_name").Value.ToString(),
  58.                                 LastName = user.Element("last_name").Value.ToString()
  59.                             };
  60.  
  61.                 foreach (var user in query)
  62.                 {
  63.                     textBoxOutput.Text += user.FirstName + " " + user.LastName;
  64.                 }
  65.             }
  66.         }
  67.     }
  68. }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут