Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867

Потоки не сразу убиваются (или так надо?)

09.08.2013, 02:40. Показов 1348. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
 
namespace test_pr
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
 
            InitializeComponent();
 
        }
        List<Thread> thread_list=new List<Thread>();
        List<test> test_list=new List<test>();
        bool fl=false;
 
        
        void Button1Click(object sender, EventArgs e)
        {
            if(!fl){
                fl=true;
        
            for (int i = 0; i < 10; i++) {
                test_list.Add(new test(this));
                thread_list.Add(new Thread(thread_metod));
                thread_list[i].Name=i.ToString();
                thread_list[i].Start(test_list[i]);
                
                
            }
            
            }
            else {
                fl=false;
                for (int i = 0; i < thread_list.Count; i++) {
                    if(thread_list[i]!=null)thread_list[i].Abort();
                }
                thread_list.Clear();
                test_list.Clear();
            
            
            }
        }
        
        void thread_metod(object o){
            test t=(test)o;
            t.go();
        
        }
 
    }
    
    public class test{
        public test(MainForm mainf){m=mainf;}
        static MainForm m;
        
        
        public void go(){
            GET("http://ya.ru");
        }
        
            private string GET(string adr){
        
                            
            HttpWebRequest rget=(HttpWebRequest) HttpWebRequest.Create(adr);
            rget.Timeout=20000;
            rget.Proxy=new WebProxy("133.9.9.9",8080);
            try{        
            WebResponse webr=rget.GetResponse();
            StreamReader abc=new StreamReader(webr.GetResponseStream());
            return abc.ReadToEnd();
            }
            catch{return "";}
            
    
        }
        
    
    
    
    }
}
При нажатиии на кнопку создаются потоки, в них передается обьект класса test , и уже из потока вызывается метод go(), который шлет запрос на сайт, с прокси сервером несуществующим . При повторном нажатии на кнопку потоки должны убиваться... Да, они убиваются, но вот не все , умирают через некоторое время ( я так предполагаю, что когда пройдет тайм аут HttpWebRequest.Timeout) Что это такое, и как это "лечить"?
На скрине пометил потоки, которые должны быть мертвы.
Миниатюры
Потоки не сразу убиваются (или так надо?)  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.08.2013, 02:40
Ответы с готовыми решениями:

Видимо некорректное соединение или так и надо?
Всем привет. Раньше не задавался вопросом этим, вроде все четко открывало и закрывало соединение. Но сейчас кол-во пользователей...

Dell SE2717H артефакты или так и надо?
Всем привет, такой вопрос к владельцам dell, когда выбираю один из игровых режимов цвета, а их 3, то появляются как бы артефакты какие то,...

Можно ли так разгонять процессор или лучше не надо?
Проц AMD Phenom II X4 Black Zosma 960T не разлоченный Температуры и загрузка процессора показаны при использовании программы...

11
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.08.2013, 06:25  [ТС]
а если вызов GET() поместить в цикл - тогда вообще перестанут потоки убиваться -

C#
1
2
3
4
5
6
7
        
        public void go(){
                for (int i = 0; i < 10; i++) 
                GET("http://ya.ru");
    
 
        }
Забавно Или я настолько уже глуп, что не вижу ошибки...

Добавлено через 2 часа 23 минуты
Вот сейчас все каким то чудесным образом заработало, хотя код такой же -

Кликните здесь для просмотра всего текста
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
96
97
98
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
 
namespace test_pr
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
        
            
            InitializeComponent();
            
        
        }
        List<Thread> thread_list=new List<Thread>();
        List<test> test_list=new List<test>();
        bool fl=false;
 
        
        void Button1Click(object sender, EventArgs e)
        {
            if(!fl){
                fl=true;
        
            for (int i = 0; i < 100; i++) {
                test_list.Add(new test(this));
                thread_list.Add(new Thread(thread_metod));
                thread_list[i].Name=i.ToString();
                thread_list[i].Start(test_list[i]);
                
                
            }
            
            }
            else {
                fl=false;
                
                for (int i = 0; i < thread_list.Count; i++) {
                    if(thread_list[i]!=null){thread_list[i].Abort();}
                }
                thread_list.Clear();
                test_list.Clear();
            
            
            }
        }
        
        void thread_metod(object o){
            try{
                test t=(test)o;
            t.go();
            }
            catch{}
        }
 
    }
    
    public class test{
        public test(MainForm y){m=y;}
        static MainForm m;
        
        
        public void go(){
                for (int i = 0; i < 1000; i++) 
                    GET("http://ya.ru");
 
 
        }
        
            private string GET(string adr){
        
                            
            HttpWebRequest rget=(HttpWebRequest) HttpWebRequest.Create(adr);
            rget.Timeout=60000;
            rget.Proxy=new WebProxy("133.9.9.9",8080);
            try{        
                WebResponse webr=rget.GetResponse();
                StreamReader abc=new StreamReader(webr.GetResponseStream());
                return abc.ReadToEnd();
            }
            catch{return "";}
            
    
        }
        
    
    
    
    }
}
Если это не в машине глюки - тогда у меня у самого наверное
Кстати - потоки завершаются быстро, но два продолжают висеть секунды 3-5... Я так понял, что у меня просто лимит на соединения по http - 2, поэтому эти два потока ожидают ответа от сервера, а остальные бездействуют и ждут своей очереди.

Не по теме:

подскажите, как увеличить это кол-во

0
112 / 86 / 21
Регистрация: 06.06.2011
Сообщений: 427
Записей в блоге: 1
09.08.2013, 09:43
Когда ты делаешь потоку Abort, то при этом потоку посылается исключение. Это исключение у тебя и перехватывается в блоке try/catch (Кстати, плохая практика: писать catch без указания конкретного исключения).
Поток должен это исключение перехватить и сам, "добровольно", закончить свою работу.
Короче, да, ты прав: поток занят чтением/ожидаением и не может сразу закончить свою работу.
И еще ты очищаешь массив потоков, не дождавшись пока они все завершатся.
1
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
09.08.2013, 12:37  [ТС]
aaleksander, тогда выходит, что вообще не следует использовать многопоток, так, как это приводит к такой бяке... Вот СНОВА оно началось
В потоке открывается соединение с сервером и потом происходит ожидание, пока мы не получим поток... НО если прокси сервер отвечает долго - то поток также будет долго висеть, и его не завершить Можно конечно взять, и выставить таймаут в 1 сек., что будет вообще "замечательно работать" Просто нет слов
Есть ли какое то решение данной проблемы?
Миниатюры
Потоки не сразу убиваются (или так надо?)  
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
10.08.2013, 00:51  [ТС]
Проблема: если попадается прокси сервер, который долго отвечает, то при остановке потоков с помощью кнопки - они висят минуты две, и ждут, пока прокси им не ответит.

Решение: делаем все потоки фоновыми, запрещаем остановку потоков при помощи кнопки. Пользователь при нажатии кнопки запуска потоков, должен будет перегрузить программу, чтобы потоки умерли, и он смог работать дальше без ожидания в 2 минуты, как бы это происходило с помощью кнопки...

Получается такая "много-функциональная программулина"....

Добавлено через 10 часов 28 минут
Завершение с помощью переменной флажка

Так, как в сети не нашел решения (так же аналогичные темы находил), то изобретаю свой велосипед. Блокировка главного потока происходит на строке , где мы пытаемся завершить другой поток с помощью Thread.Abort()... так, как поток уже ожидает приеима от сервера - наверное поэтому и висит форма, потому что поток завершить нельзя.. Значит нужно не использовать этот метод, а завершать поток к примеру при изменении переменной флажка... Как это все выглядит -

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
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
 
namespace test_pr
{
 
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            
 
        }
        List<Thread> thread_list=new List<Thread>();
        List<test> test_list=new List<test>();
        bool fl=false;
        
        public Object lock_o=new Object();
        string[] proxy=new string[]{
            "66.196.48.118:8080",
            "125.32.31.174:8080",
            "100.46.245.130:8080",
            "113.10.180.175:80",
            "116.236.106.100:8080"};
 
        
        void Button1Click(object sender, EventArgs e)
        {
            if(!fl){
                fl=true;
        
            for (int i = 0; i < 50; i++) {
                test_list.Add(new test(this));
                thread_list.Add(new Thread(thread_metod));
                thread_list[i].Name=i.ToString();
                test_list[i].sr=proxy;
                thread_list[i].IsBackground=true;
                thread_list[i].Start(test_list[i]);
                
                
            }
            
            }
            else {
                fl=false;
            for (int i = 0; i <thread_list.Count; i++) {
                    test_list[i].l=true;
            }
            thread_list.Clear();
            test_list.Clear();
            
            
            }
        }
 
        
        void thread_metod(object o){
            try{
                test t=(test)o;
            t.go();
            }
            catch{}
        }
 
    }
    
    public class test{
        public test(MainForm y){m=y;}
        static MainForm m;
        public string[] sr;
        public bool l=false;
        
        public void go(){
                for (int i = 0; i <sr.Length; i++) 
                    if(!l)GET("http://ya.ru",sr[new Random().Next(sr.Length)]);
 
 
        }
        
            private string GET(string adr,string p){
        
            string[] u=p.Split(':');
            HttpWebRequest rget=(HttpWebRequest) HttpWebRequest.Create(adr);
            rget.Timeout=20000;
            rget.Proxy=new WebProxy(u[0],Convert.ToInt32(u[1]));
            try{        
                WebResponse webr=rget.GetResponse();
                StreamReader abc=new StreamReader(webr.GetResponseStream());
                return abc.ReadToEnd();
            }
            catch{return "";}
            
    
        }
        
    
    
    
    }
}
Уже лучше. Мы избавились от зависания главной формы, но не избавились от потоков, которые висят... Они завершаются по истечении таймаута соединения... Вот если пользователь за это время успеет нажать кнопку много раз - будет целая куча потоков висеть, что грозит утечкой памяти и зависанию системы в целом...
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.08.2013, 01:39
C#
1
2
3
4
5
6
        void thread_metod(object o){
            try{
                test t=(test)o;
            t.go();
            }
            catch{}
Вот это жесть ...
0
10.08.2013, 01:56

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
Вот это жесть ...
типа все остальное нормально...

0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
10.08.2013, 02:00  [ТС]
Jupiter, подскажите, что не нормально, и как сделать нормально?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.08.2013, 02:07
чем неподходит асинхронный запрос?
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
10.08.2013, 02:11  [ТС]
Jupiter, тем, что в классе test еще что то будет, кроме отправки запросов. Это просто тестовый проект
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.08.2013, 02:13
ок. чем неподходит ThreadPool?
Цитата Сообщение от Winhttp22 Посмотреть сообщение
C++
1
2
3
for (int i = 0; i < 50; i++) {
* * * * * * * * test_list.Add(new test(this));
* * * * * * * * thread_list.Add(new Thread(thread_metod));
это ж не фантики
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
10.08.2013, 02:43  [ТС]
Jupiter, как пул решит проблему? "Засунем" метод, и будем так же ожидать, пока не отработает.... или нет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.08.2013, 02:43
Помогаю со студенческими работами здесь

Формы: Можно ли сразу всем сделать, или надо прорисовывать кнопки "ручками" для каждой
Здравствуйте! Подскажите &quot;хитрость&quot; (если есть) управления сразу всеми формами. Скажем есть 40 форм, необходимо добавить такие кнопки как:...

Баг, фича, или кривые руки? LED горит не так, как надо.
Код изначально должен был работать с китайским 433MHz ресивером. при поступлении сигнала на выходе ресивера появляется лог.1. при...

Так ли важна в реальной жизни скорость записи SSD, или смотреть надо только на скорость чтения, а на запись пофигу
https://www.citilink.ru/catalog/computers_and_notebooks/hdd/ssd_in/420250/ вот у него скорость записи низкая, но он самый популярный

Или мне так не повезло с RLC APPA701 или так и есть?
Купил RTS APPA701. Купил в фиме &quot;ПРИСТ&quot; (никому её не посоветую). Прислали по почте и в день получения этого прибора был очень рад, т.к....

Убиваются MP3 файлы
Всем добрый день!!! Я слышал что в этом году усилилась хакерская атака на MP3 формат.Привёз товарищ бук с убитыми МР3.Скачанная с инета...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru