Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 28.08.2014
Сообщений: 8
.NET 4.x

Запуск кода асинхронно

08.03.2016, 17:50. Показов 903. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день господа!
Имею следующий класс:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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();

Все работает, все загружает. Но вот незадача - пока программа прогружает нужную страницу, программа висит!
Пытался по разному переделать данный код в асинхронный, но безрезультатно!

Прошу вашей помощи по оптимизации и запуску асинхронно данный кусок программы!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.03.2016, 17:50
Ответы с готовыми решениями:

Запуск неуправляемого кода внутри кода c#
часто требуется при выполнении программы запускать исполняемые файлы (exe) с ключами. Для этого использую пространство имен using...

Запуск программы из готового кода
На сайте представлена работа с листингом в конце, нужно запустить программу, не могу понять как, ибо в этом почти не разбираюсь, может кто...

Запуск процедуры Oracle из кода
Здравствуйте, подскажите где можно посмотреть пример запуска процедуры Oracle из кода C#?

8
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.03.2016, 17:54
arrer, используйте класс HttpClient, он поддерживает асинхронность и не требует изобретения велосипедов.

Добавлено через 1 минуту
Пример асинхронного метода с применением этого класса.
0
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 33
08.03.2016, 18:23
Я, конечно, не топ прогер, но когда сталкиваюсь с аналогичной проблемой просто выношу эту опцию в отдельное фоновое приложение и изобретаю костыль для передачи данных между ними.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.03.2016, 18:36
KIROS,
0
0 / 0 / 0
Регистрация: 28.08.2014
Сообщений: 8
08.03.2016, 18:52  [ТС]
Так, хорошо...
Как все это теперь добро переписать на HttpClient ?

Я так понимаю мне надо переписать
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        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;
            }
        }

на подобие такого варианта?

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public static async Task<string> getRequest(string url)
        {
            try
            {
                Client = new HttpClient();
                string responseBodyAsText;
 
                HttpResponseMessage response = await Client.GetAsync(url);
                response.EnsureSuccessStatusCode();
 
                return responseBodyAsText = await response.Content.ReadAsStringAsync();
            }
            catch (Exception ex)
            {
                // For debugging
                return string.Empty;
            }
        }

И как мне тогда теперь это в ReadNews исправить, чтобы строка doc.LoadHtml(getRequest его понимала? Или тоже в async переделывать, но тогда как мне изменить это NewsLb.ItemsSource = News.ReadNews(); ?

Не могли бы вы переделать мой код из первого поста на Async, а то боюсь ох сейчас наворочу....
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.03.2016, 18:57
arrer, я же кинул ссылку например. Там все видно. Как получить html код в виде string отлично видно из этой строчки:
C#
1
return (await (await Client.PostAsync("/login.php?do=login", cont)).Content.ReadAsStringAsync()).Contains("Спасибо, что зашли");
Делайте по аналогии. Никакие стримы там не нужны.

Добавлено через 56 секунд
В данном строчке проверяется, содержит ли html код ответа фразу "Спасибо, что зашли", и возвращает true если да и false если нет.
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
09.03.2016, 01:18
Вот вам маленький примерчик, где я по кнопке делаю запрос на VK, а он возвращает список друзей пользователя в асинхронном методе:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
 
/*
<?xml version="1.0" encoding="utf-8"?>
<response list="true">
 <user>
  <id>66748</id>
  <first_name>Олег</first_name>
  <last_name>Илларионов</last_name>
  <hidden>1</hidden>
 </user>
</response>
*/
 
namespace GetXmlFromVk
{
    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 w = new WebClient())
            {
                w.Encoding = Encoding.UTF8;
                var resp = await w.DownloadStringTaskAsync("https://api.vk.com/method/users.get.xml?user_id=66748&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;
                }
            }
        }
    }
}
1
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
09.03.2016, 06:44
8Observer8, как вариант, но WebClient-он иногда удобный, но не со всеми видами HTTP запросов умеет нормально работать. В отличии от HttpClient.
1
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
10.03.2016, 20:57
Заменил WebClient на HttpClient:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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;
                }
            }
        }
    }
}
Миниатюры
Запуск кода асинхронно  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.03.2016, 20:57
Помогаю со студенческими работами здесь

Запуск командной строки из кода программы
Пишу свою среду разработки программ на Ассемблере. Код из РичТекстБокса сохраняю в текстовый файл с расширением .asm Столкнулся с...

Запуск JS кода и объекты window, document
пытаюсь запустить жску с помощью Noesis.Javascript, пример : StreamReader sr = new StreamReader(@&quot;C:\js.js&quot;); string...

Запуск из кода в разных потоках одного *.EXE
Здравствуйте всем! задание: допустим есть 100 файлов, есть фильтр filter.exe задача: отфильтровать эти 100 файлов в несколько...

Запустить асинхронно функцию
Привет. Подскажите как по простому запустить асинхронный поток. В примерах везде с сетью связано. Надо типа такого, чтобы выводило...

Вызов метода асинхронно
Добрый день! Необходимо, что бы вызов метода Method происходил асинхронно (ну т.е. сам метод выполняся асинхронно), все мои попытки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru