.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;
}
}
}
}
}