Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
.NET 4.x

Работа с потоками

13.03.2013, 10:42. Показов 2552. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня приложение через заданный интервал (в таймере) отправляет запрос на сайт и парсит ответ, при отправке запросов приложение подвисает, нужно прикручивать потоки, но что будет если поток еще будет выполняться а таймер запустит еще один, а мне бы этого не хотелось, нельзя отправлять следующий запрос пока мы не пропарсили ответ от предыдущего. Как быть в данном случаи?
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.03.2013, 10:42
Ответы с готовыми решениями:

Работа с потоками
Ребята, помогите. На C# программирую недавно, про потоки слышу впервые. Подскажите как это можно реализовать в VS2005. 1. Warcraft....

Работа с потоками
Доброе время суток подскажите пож как реализовать : "Шарики. Координаты заданного количества шариков изменяются на случайную величину по...

работа с потоками
При работе с методом выдает ошибку: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления...

29
Заблокирован
13.03.2013, 10:49
смотреть в сторону WaitHandle. собственно можно опрашивать IAsyncResult который возвращается при выполнении асинхронного запроса Begin***().
1
1 / 3 / 2
Регистрация: 30.12.2010
Сообщений: 45
13.03.2013, 10:49
проверяй перед запуском если предыдущий поток жив через свойство Thread.IsAlive
1
Заблокирован
13.03.2013, 10:59
Цитата Сообщение от wolfinil Посмотреть сообщение
проверяй перед запуском если предыдущий поток жив через свойство Thread.IsAlive
плохо. тут поток явно не нужно создавать. нужно использовать HttpWebRequest.BeginGetResponse.

Добавлено через 2 минуты
можно тупо стопить таймер на время выполнения, а в конце колбека стартовать заново.

Добавлено через 29 секунд
короче решений тьма.
Цитата Сообщение от wolfinil Посмотреть сообщение
Thread.IsAlive
но не это.
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
13.03.2013, 11:04  [ТС]
Цитата Сообщение от loro Посмотреть сообщение
нужно использовать HttpWebRequest.BeginGetResponse.
Исходники дома, посмотрю вечером.


Цитата Сообщение от wolfinil Посмотреть сообщение
проверяй перед запуском если предыдущий поток жив через свойство Thread.IsAlive
думал об этом, но тогда такая неприятная штука получается, к примеру таймер у меня с интервалом в минуту, получается перед вызовом таймер проверил что поток еще работает и не вызвал нужную ф-ю, и опять ждать минуту, а тот поток что мешал взял и через пару секунд завершился.

Цитата Сообщение от loro Посмотреть сообщение
смотреть в сторону WaitHandle. собственно можно опрашивать IAsyncResult который возвращается при выполнении асинхронного запроса Begin***().
вообще не понял )) можно в двух словах что это и с чем едят
0
Заблокирован
13.03.2013, 11:10
О IAsyncResult
http://msdn.microsoft.com/ru-r... .100).aspx

HttpWebRequest.BeginGetResponse
http://msdn.microsoft.com/ru-r... ponse.aspx
0
1 / 3 / 2
Регистрация: 30.12.2010
Сообщений: 45
13.03.2013, 11:17
Цитата Сообщение от anonimus Посмотреть сообщение
к примеру таймер у меня с интервалом в минуту, получается перед вызовом таймер проверил что поток еще работает и не вызвал нужную ф-ю, и опять ждать минуту, а тот поток что мешал взял и через пару секунд завершился.
ну вообще-то это и есть вариант когда таймер делает свою работу. Если таймер проверил,а поток еще не завершился, то кажется это равносильно тому что таймер запустил поток, просто работа произошла за пару секунд, а таймер считает снова.
0
Заблокирован
13.03.2013, 11:29
а забейте.. короче.
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
13.03.2013, 12:13  [ТС]
loro, в msdn много кода, а вот если сжато.
Понимаю что пример писать лень, вот я тут в несколько строк накидал то насколько понял, правильно или нет?

Не по теме:

писал "на коленке"


C#
1
2
3
4
5
6
7
8
HttpWebRequest req = (HttpWebRequest)WebRequest.Create( uri );
IAsyncResult asyncResult = req.BeginGetResponse( null, req );
HttpWebRequest request = (HttpWebRequest) asyncResult.AsyncState;
 using ( var response = request.EndGetResponse( asyncResult ) ) {
     using ( var reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII ) ) {
       string html =  reader.ReadToEnd();
     }
}
только куда тут IAsyncResult привернуть не пойму

Добавлено через 29 минут
куда-то все пропали (
А что если в место IsAlive буду использовать
Join();
тогда в принципе будет работать как надо
0
774 / 554 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
13.03.2013, 12:20
Пример асинхронного запроса
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
 public void send()
            {
                HttpWebRequest reQ = (HttpWebRequest)HttpWebRequest.Create("index.php");
                reQ.Method = "POST";
                reQ.Headers.Add("X-Requested-With", "XMLHttpRequest");
                reQ.Host = ".ru";
                reQ.ContentLength = dat.Length;
                reQ.ServicePoint.Expect100Continue = false;
                reQ.KeepAlive = false;
                reQ.AllowAutoRedirect = true;
                reQ.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");
                reQ.Headers.Add(HttpRequestHeader.Cookie, CCookie);
                reQ.Accept = "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
                reQ.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
                reQ.Headers.Add(HttpRequestHeader.AcceptCharset, "windows-1251,utf-8;q=0.7,*;q=0.7");
                reQ.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
                reQ.Headers.Add(HttpRequestHeader.AcceptLanguage, "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
                reQ.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.2)";
                reQ.ContentType = "multipart/form-data; boundary=41184676334"; 
                reQ.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), reQ);
               
                
            }
 
            public void GetRequestStreamCallback(IAsyncResult asynchronousResult)
            {
                HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
                Stream postStream = request.EndGetRequestStream(asynchronousResult);
 
                postStream.Write(dat, 0, dat.Length);
                postStream.Close();
                request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
            }
          
 
            public void GetResponseCallback(IAsyncResult asynchronousResult)
            {
                HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
                Stream streamResponse = response.GetResponseStream();
                StreamReader streamRead = new StreamReader(streamResponse);
                string responseString = streamRead.ReadToEnd();
 
 
                streamResponse.Close();
                streamRead.Close();
                response.Close();
 
            }
2
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
13.03.2013, 12:25  [ТС]
Vitall, ооо спасибо тебе
Держи прибавку к карме )

Добавлено через 3 минуты

Не по теме:


раньше можно было прибавить к репутации больше одного, а теперь что убрали, или я не там смотрю

0
13.03.2013, 12:32

Не по теме:

Цитата Сообщение от anonimus Посмотреть сообщение
раньше можно было прибавить к репутации больше одного, а теперь что убрали, или я не там смотрю
Через отзыв можно увеличить плечо :)

1
13.03.2013, 12:37  [ТС]

Не по теме:


не могу
"Вы должны добавить отзыв кому-то ещё, прежде чем сможете снова добавить его Vitall"
кому-то еще оставил отзыв, все равно пишет

0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.03.2013, 12:54
anonimus, забей, не убудет, если репы не добавят


Есть еще вариант через async/await если .Net 4.5 использовать.
1
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
13.03.2013, 13:02  [ТС]
Psilon, да ладно, асинхронный вызов вполне устраивает
0
13.03.2013, 13:25

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
забей, не убудет, если репы не добавят
Ага и другим завидно не будет :D ЧВС штука тонкая )

1
13.03.2013, 13:34

Не по теме:

Vitall, :)

0
Заблокирован
13.03.2013, 13:44
Vitall, для отзыва мало пота и крови расскажи ананимному как ему IAsyncResult заюзать, подкину своих могучих 4 балла И еще колбэк хорошо бы завернуть try catch finally , т.к. при вызове End*** может exсeption полететь.
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
13.03.2013, 13:46  [ТС]
loro, ну так ты ж и расскажи, подкину 100 балов )
0
Заблокирован
13.03.2013, 14:02
Лучший ответ Сообщение было отмечено как решение

Решение

Глобальные:
C#
1
2
3
 System.Threading.Thread thread = null;
        ManualResetEventSlim resEvent = new ManualResetEventSlim(true);
        CancellationTokenSource cts = null;
Функция передаваемая в новый поток:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 void ThreadFunction(object args)
        {
            var input = (System.Tuple<ManualResetEventSlim, CancellationToken>)args;
            input.Item1.Reset();
            System.Net.HttpWebRequest request = System.Net.HttpWebRequest.CreateHttp("http://google.ru");
            IAsyncResult result = request.BeginGetResponse(null, null);
            while (!result.IsCompleted)
            {
                if (input.Item2.IsCancellationRequested)
                {
                    request.Abort();
                    input.Item1.Set();
                    return;
                };
 
            }
            System.Net.WebResponse data = request.EndGetResponse(result);
            //Обработка результата
            //...
            data.Close();
            input.Item1.Set();
        }
Функция вызываемая таймером:
C#
1
2
3
4
5
6
7
8
9
 private void Timer(object sender, EventArgs e)
        {
            if (resEvent.IsSet)
            {
                cts = new CancellationTokenSource();
                thread = new Thread(ThreadFunction);
                thread.Start(new Tuple<ManualResetEventSlim, CancellationToken>(resEvent, cts.Token));
            }
        }
Если нужно отменить текущий незавершенный запрос и начать новый:
C#
1
2
3
4
5
6
7
8
  private void button_Click(object sender, EventArgs e)
        {
            if (!resEvent.IsSet)
            {
                cts.Cancel();
                resEvent.Wait();
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.03.2013, 14:02
Помогаю со студенческими работами здесь

Работа с потоками...
Понимаю, что тема проезжена и не раз, однако спрошу:-[: Есть консольное приложение, оно занимается подсчетом сообщений. По запросу оно...

Работа с потоками
Здравствуйте. Проблема заключается в следующем, в параллельном потоке мне нужно чтобы label1 созданный в основном потоке, изменялся....

Работа с байтовыми потоками
Доброго времени суток. Столкнулся с такой проблемой , имеется файл(песня mp3) необходим считать из него скажем первые 10 байт и потом...

Работа с потоками
Помогите начинающему программисту!!! Нужно написать программу в которой есть два дочерних потока. В главном потоке интовой переменной...

Работа с потоками
В общем, сделал рекурсивное удаление файлов и папок в несколько потоков, но вылетают эксепшены что файл уже удален. Можно ли как-то...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru