Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 12

Асинхронный метод + потоки

15.03.2013, 20:54. Показов 3379. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Возможно вопрос и дилетантский, поэтому заранее извиняюсь.
Делаю парсер сайта, на сайте есть несколько разделов. Использую TabControl и асинхронный метод HttpWebRequest для загрузки этих разделов в TextBox при изменении вкладки.
Проблема в том, что если быстро щелкая по вкладкам то загруженная информация "догоняет" и записывает в последний TextBox, последней вкладки, а предыдущие поля пустые.
Также использую INotifyPropertyChanged, при изменении свойств.
Это моя первая программа с потоками, и подозреваю что не так понял их, отсюда и проблемы по ходу. Буду благодарен за помощь/разъяснения в реализации подобных задач.

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
void fly_TickersPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            
            Thread t = new Thread(new ThreadStart(delegate
            {
                
                this.Invoke(new ThreadStart(delegate
                {
                    tabControl1.Controls[fly._currentTab].Controls[0].Text = fly.tickers;
                }
                ));
            }));
            t.Start();
        }
 
        private void tabControl1_Selected(object sender, TabControlEventArgs e)
        {
            switch (tabControl1.Controls[tabControl1.SelectedIndex].Text)
            {
                case "All News":
                    fly._typeNews = e.TabPage.Text;
                    fly._currentTab = e.TabPage.Name;//Передаем имя закладки по которой произошел клик
                    fly.StartAsyncRequest(fly._urlAllNews);
                    //@"//*[@class='anchors_link']"
                    break;
                case "Hot Stocks":
                    //MessageBox.Show(tabControl1.Controls[tabControl1.SelectedIndex].Text);
                    fly._currentTab = e.TabPage.Name;//Передаем имя закладки по которой произошел клик
                    //MessageBox.Show(fly._url + tabControl1.Controls[tabControl1.SelectedIndex].Text);
                    fly._typeNews = e.TabPage.Text;
                    //MessageBox.Show(fly._typeNews);
                    fly.StartAsyncRequest(fly._url + fly._typeNews);
                    //@"//*[@title='Hot Stocks']"
                    break;
}
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.03.2013, 20:54
Ответы с готовыми решениями:

Фоновый/асинхронный метод
Моя программа делает следующее: программа делит файл на части, затем с созданными частями производятся действия, после завершения...

Асинхронный метод долго (никогда?) не завершается
Добрый день. Вызываю асинхронный метод вот так: StockOrderInfo info; info.account = ""; ...

Программа не дожидается, пока выполнится асинхронный метод
У меня есть два метода: public async static Task Challenge() //Авторизация в системе { string accessKey =...

22
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.03.2013, 23:48
speculari, ну может написать специальный класс, который будет выгружать информацию в контролы только когда полностью прогрузится? То есть есть класс, реализующий INotify, в него грузим страницу, как только щелкаем на другую, он прекращает грузить и начинает грузить новую. Для этого в этом классе должен создаваться свой поток для загрузки. То есть что-то вроде
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class LazyLoader : INotify...
{
   private string result;
   private Thread t = new Thread();
 
   public Action<string> event DataDownloaded;
   public void StartLoadAsync(string data)
   {
      if (t.IsAlive)
         t.Abort();
      var t = new Thread(Download(data));
      ...
      DataDownloaded(result);
   }
}
что-то в таком духе имхо. Думаю суть ясна
1
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 12
16.03.2013, 00:25  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
speculari, ну может написать специальный класс, который будет выгружать информацию в контролы только когда полностью прогрузится? То есть есть класс, реализующий INotify, в него грузим страницу, как только щелкаем на другую, он прекращает грузить и начинает грузить новую. Для этого в этом классе должен создаваться свой поток для загрузки. То есть что-то вроде
что-то в таком духе имхо. Думаю суть ясна
Хм, мысль интересная. Спасибо! Вот только как сделать, чтобы догружало предыдущий запрос в предыдущий контрол...?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.03.2013, 01:00
speculari, просто грузится инфа, когда она догружается райзится событие, а в EventArgs передается то, что собственно и загрузилось
1
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 12
16.03.2013, 01:19  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
speculari, просто грузится инфа, когда она догружается райзится событие, а в EventArgs передается то, что собственно и загрузилось
Ну да, вроде понял Вашу идею. Попробую реализовать. Спасибо!
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.03.2013, 01:26
speculari, всегда пожалуйста
0
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 12
16.03.2013, 20:09  [ТС]
В своем классе только добавил 2 строчки, и вроде результат тот, что хотел.
C#
1
2
if (t.IsAlive)
  t.Abort();
Добавлено через 2 часа 8 минут
Цитата Сообщение от speculari Посмотреть сообщение
В своем классе только добавил 2 строчки, и вроде результат тот, что хотел.
C#
1
2
if (t.IsAlive)
  t.Abort();
Все таки через раз оно работает. Решил отказаться от асинхронной загрузки (HttpWebRequest), а использовать BackgroundWorker и синхронную загрузку HttpWebRequest.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
20.03.2013, 22:30
Эххх молодежжжжжж :-D
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Security.Policy;
using System.IO;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void buttonAsyncLoad_Click(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem((object target) =>
            {
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(new Uri("https://www.google.com"));
                AutoResetEvent waiter = new AutoResetEvent(false);
                httpWebRequest.BeginGetResponse((IAsyncResult asyncResult) =>
                {
                    HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult);
                    using (StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream()))
                        richTextBox1.Invoke(((Action)(() => { richTextBox1.Text = reader.ReadToEnd(); })));
                    waiter.Set();
                },null);
                waiter.WaitOne();
            });
        }
    }
}
Вложения
Тип файла: rar WindowsFormsApplication2.rar (38.5 Кб, 6 просмотров)
1
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
20.03.2013, 22:41
кхм...

Добавлено через 3 минуты
убери AutoResetEvent он там не нужен, я немного перестраховался
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.03.2013, 23:20
агерон, можно вообще в 2 строчки
C#
1
2
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(new Uri("https://www.google.com"));
var result = await httpWebRequest.GetResponseAsync();
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
21.03.2013, 07:33
вкусный синтаксический сахарок но извеняйте, ради 1 инструкции менять в команде версию среды :-D, это слишком :-D, вон некоторые на 2.0 сидят и в ус не дуют
0
774 / 554 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
21.03.2013, 21:53
Цитата Сообщение от агерон Посмотреть сообщение
вон некоторые на 2.0 сидят и в ус не дуют
Да у них поди до сих пор Windows 95 стоит
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.03.2013, 07:03
агерон, весь код в win8 обязан быть асинхронным, я думаю, что в win blue ничего не изменится. Так что в любом случае придется учиться ими пользоваться (в смысле авайтами)
Алсо: http://blogs.msdn.com/b/develo... k-4-5.aspx
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
22.03.2013, 07:57
Psilon, для чего это все? Смысл учить .NET 4.5 если его нельзя поставить на XP/Win7, ModernUI приложения не пользуются особой популярностью, а разрабатывать несколько версий приложения под разные фреймворки - это тот еще маразм.

Добавлено через 1 минуту
UPD
Глянул ссылку после написания поста, стало интересно, может был не прав
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
22.03.2013, 11:08
Цитата Сообщение от Psilon Посмотреть сообщение
агерон, весь код в win8 обязан быть асинхронным, я думаю, что в win blue ничего не изменится. Так что в любом случае придется учиться ими пользоваться (в смысле авайтами)
Алсо: http://blogs.msdn.com/b/develo... k-4-5.aspx
Ну это еще бабушка надвое сказала , не все пользователи еще ушли WinXP а вы тут про асинхронные модели :-D, асинхронность не есть серебряная пуля и да покажите заявление Microsoft про ВЕСЬ КОД КОТОРЫЙ ОБЯЗАН БЫТЬ АСИНХРОННЫМ, а что все программы которые были написаны до Win8 нужно выкинуть на свалку?? потому что они работать не будут? ВЫ ПОНИМАЕТЕ ЧЕМ ЭТО ГРОЗИТ? да любой бизнес выкинет в таком случае Win8 на свалку вы пожалуйста вспомните что такое наработанный код и чем грозит отказ от поддержки этого кода в Microsoft не идиоты сидят и пилить своими руками сук на котором сидят не будут :-D, и вообще четные версии винды можно не выпускать они провальны априори :-D
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.03.2013, 12:02
агерон,
Поэтому, создавая новую версию Windows, в Microsoft понимали, что необходимо
разработать и новый API, который, будучи родным (native) для операционной сис-
темы, станет отвечать новым требованиям и веяниям времени. В результате по-
явился Windows Runtime (WinRT).
Windows Runtime — это новая модель разработки приложений, а также объектно-
ориентированный языконезависимый программный интерфейс (API), написанный
на неуправляемом коде и реализующий концепции асинхронного программирова-
ния. Все функции и методы, потенциально работающие более 50 мс, реализованы
асинхронно. Синхронных аналогов для них нет. Это обеспечивает лучшие характе-
ристики и бóльшую "отзывчивость" приложений.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
22.03.2013, 22:01
ооо пошло цетирование .... так вот тебе ссылка из википедии
Windows Runtime, или WinRT — это новая (по состоянию на 2011 год) модель программирования от Microsoft, являющаяся основой для разработки приложений в стиле Метро в новой операционной системе Windows 8[1][2]. WinRT поддерживает разработку на C++ (обычно с использованием расширения языка Component Extensions, C++/CX), управляемых языках C# и VB.NET, а также JavaScript.

WinRT по существу является API на основе технологии COM. Из-за своей COM-подобной основы, WinRT позволяет относительно легко обращаться к нему из различных языков программирования, как это происходит в COM, но это, по существу, неуправляемый, родной API. Определения API хранятся в «.winmd» файлах, закодированных в формате метаданных ECMA 335, который используется в .Net с некоторыми изменениями.[3] Этот общий формат метаданных позволяет значительно уменьшить накладные расходы при вызове WinRT из .NET приложений по сравнению с P/Invoke, имея при этом намного более простой синтаксис.[4] Новый язык C++/CX (Component Extensions), который заимствует некоторые элементы синтаксиса из C++/CLI, позволяет создавать и использовать WinRT-компоненты с меньшим количеством видимой для программиста обвязки по сравнению с классическим программированием COM в C++, и в то же время накладывает меньше ограничений по сравнению с C++/CLI на смешение типов. Обычный С++ (с COM-специфичными требованиями) также может быть использован для программирования с компонентами WinRT.[5] Это возможно с помощью новой библиотеки шаблонов Windows Runtime C++ Template Library (WRL), которая аналогична по своей цели тому, что библиотека ATL обеспечивает для COM.[6] Документация MSDN однако рекомендует использовать C++/CX вместо WRL.[7]
COM технология ну что ж может быть... а вот где твою хваленные 50 мс я так и не понял запомни РАЗ И НА ВСЕГДА, ВБЕЙ СЕБЕ В ПОДКОРКУ !!! СТАРЫЙ КОД НЕ ПЕРЕПИСЫВАЮТ!!! сейчас столько win32 приложений и библиотек на "старом" WinApi что тебе и не снилось!!!! и никто от него отказываться не будет, а насчет того что
Все функции и методы, потенциально работающие более 50 мс, реализованы
асинхронно
это ваши хотелки... как ты кпримеру определишь производительность функции не выполняя ее?:-D это смешно... а учитывая что 80% времени работает всего 20% кода приложения совсем весело получается учите мат часть юноша да асм не забудьте подучить прежде чем кидаться многословными предложениями!! ЗАПОМНИ ОДНОПОТОЧНАЯ ПРОГРАММА НИКОГДА НЕ СТАНЕТ МНОГОПОТОЧНОЙ БЕЗ ИЗМЕНЕНИЯ ЕЕ АРХИТЕКТУРЫ!!! а среди старого бизнес кода такого 80%, и только 20% это много поточная обвеска, и то невсегда, запомни бизнес никогда не будет платить за то чтобы ТЫ переписал программу на MetroUI бизнесу нужно рещать задачи а не рюшечки красивые, и поверь моему опыту те кто платят тебе зарплату 100 раз подумают прежде чем согласяться на новую версию программы т. к. это нехилые затраты по времени и деньгам
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.03.2013, 22:21
Цитата Сообщение от агерон Посмотреть сообщение
COM технология ну что ж может быть... а вот где твою хваленные 50 мс я так и не понял запомни РАЗ И НА ВСЕГДА, ВБЕЙ СЕБЕ В ПОДКОРКУ !!! СТАРЫЙ КОД НЕ ПЕРЕПИСЫВАЮТ!!! сейчас столько win32 приложений и библиотек на "старом" WinApi что тебе и не снилось!!!! и никто от него отказываться не будет, а насчет того что
Не помню, чтобы были с тобой на ты, ну да ладно...
это ваши хотелки... как ты кпримеру определишь производительность функции не выполняя ее?:-D это смешно... а учитывая что 80% времени работает всего 20% кода приложения совсем весело получается учите мат часть юноша да асм не забудьте подучить прежде чем кидаться многословными предложениями!!
Ну да, ты же госу профи, а тут одни студенты-перваки собрались лабы обсуждать. Асм, да, только гуру могут постичь 3.5 оператора, уровнем чуть-чуть ниже Pure C.
ЗАПОМНИ ОДНОПОТОЧНАЯ ПРОГРАММА НИКОГДА НЕ СТАНЕТ МНОГОПОТОЧНОЙ БЕЗ ИЗМЕНЕНИЯ ЕЕ АРХИТЕКТУРЫ!!!
Скажи это функциональным яп
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
22.03.2013, 22:30
Один ТОЛЬКО ОДИН ВОПРОС !!! WinApi написана на ФП?:-D если ДА то на каком!!! :-D
Запомни чудик никто НИКТО И НИКОГДА НЕ БУДЕТ ПЕРЕПИСЫВАТЬ КОД КОТОРЫЙ ВЫПОЛНЯЕТ СВОЮ ЗАДАЧУ!!! хотя бы на среднею "3" а о оценке "5" мы вообще молчим, с такого кода сдувают пылинки, и не трогают, пока ты не поймешь что ЛЮБОЕ ИЗМЕНЕНИЕ АРХИТЕКТУРЫ ИЛИ ВЗАИМОДЕЙСТВИЯ КОДА ТРЕБУЕТ ДЕНЕГ ты будешь СТУДЕНТОМ который пишет 3,5 оператора на Pure C (хех... ты еще попробуй на нем это написать ), как я вижу смысла спорить с тобой нет ибо ты никогда не задумывался, А СТОИТ ЛИ ТРОГАТЬ ТО ЧТО И ТАК РАБОТАЕТ? :-D
0
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 12
22.03.2013, 23:06  [ТС]
А как вообще можно протестировать программу, как она будет себя вести на другой ОС без установления этой ОС? У меня что-то моя прога на 7 не адекватно ведет...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2013, 23:06
Помогаю со студенческими работами здесь

Socket.Send + Async & Await: свой асинхронный метод отправки данных
Привет. Хочу написать свой асинх. метод для отправки данных при помощи класса Socket и его метода Send. Работать должно так. Есть некий...

Асинхронный метод работы с таблицей SQL
Прошу сильно в меня не кидаться, я только начал изучать Си шарп. Пытаюсь заставить в представлении показывать те данные, которые мне...

Асинхронный метод
Есть программа, архивирует видео-файлы с целью бэкапа, запускается каждый день в 20.00. Сейчас есть необходимость добавить ручной запуск....

Асинхронный метод поддерживающий ожидание
Добрый день! При выполнении асинхронного метода у меня возникла потребность приостановить выполнение основного потока до завершения...

Сделать асинхронный метод с задержкой
Никак не могу разобраться с этими asynk\away если коротко, то есть два метода ПЕРВЫЙ должен сделать задержку выполнения задачи ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru