Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 12
1

Правильная остановка потоков

21.02.2014, 21:10. Показов 3103. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
нужно правильно остановить потоки(на кнопку стоп(!)), чтобы они завершились и можно было закрыть программу без прерывания.
так создаю потоки:
C#
1
2
3
4
5
6
7
8
9
10
private void start_Click(object sender, EventArgs e)
        {
                for (int i = 0; i <= threads.Value; i++)
                {
                    Thread th = new Thread(new ThreadStart(this.Regging));
                    th.IsBackground = true;
                    th.Start();
                }
            
        }
сама функция:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void Regging()
        {
            try
            {
                using (var request = new HttpRequest())
                {
                    бла бла бла              
                }
            }
            catch
            {
 
            }
            finally
            {
                Regging();
            }
        }
пытался через th.Join();, но так не выходит( нужно как-то вытащить номера потоков и их завершать, а незнаю как... msdn не помог, по моему способу создания в гугле информации нет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2014, 21:10
Ответы с готовыми решениями:

Остановка потоков
Имеется консольное приложение, в котором запускается несколько потоков. Сделать так, чтобы при...

Остановка потоков
У меня в программе есть некий код, создающий новый поток вот этого кода: try { Socket...

Остановка дочерних потоков
Основная программа запускает 2 потока для определенных вычислений, при этом сама запускает таймер...

Взаимодействие двух потоков и их остановка при выполнении условия
Такой вопрос: Есть два потока, каждый из которых меняет некоторые значения в массиве. Надо это...

5
3664 / 2576 / 718
Регистрация: 02.08.2011
Сообщений: 6,947
21.02.2014, 21:15 2
Цитата Сообщение от d0k3r Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
using (var request = new HttpRequest())
 {
 бла бла бла 
 }
finally
{
  Regging();
}
После выполнения поток завершается и ОС освобождает его ресурсы. Зачем его останавливать?

Добавлено через 1 минуту
К тому же они фоновые, при завершении основного в любом случае завершат свою работу.
0
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 12
21.02.2014, 21:17  [ТС] 3
у меня в finally он опять создаётся. нужно или правильно в самом начале их создать, или найти решение, чтобы их можно было останавливать, не закрытием программы.

суть программы: задаем 10 потоков и программа работает постоянно с этими потоками, но нужно их остановить и только потом закрыть программу. похоже на регер\парсер и т.д.
0
3664 / 2576 / 718
Регистрация: 02.08.2011
Сообщений: 6,947
21.02.2014, 21:21 4
Как вариант: поток завершается, когда завершается работа метода. Можно повесить флаг , перед запуском потоков flag = false; при нажатии на кнопку flag = true, а методе сделать проверку if (flag)return;

Добавлено через 11 секунд
Как-то так.
1
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.02.2014, 21:26 5
d0k3r, используй пул потоков, или как-то так:
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
  class CancellableThread
    {
        private readonly Thread thread;
        private bool run;
 
        public CancellableThread(Action threadStart)
        {
            thread = new Thread(()=>
                     {
                         while (run)
                         {
                             threadStart();
                         }
                     });
        }
 
        public CancellableThread(Action<object> parameterizedThreadStart)
        {
            thread = new Thread(obj =>
                                {
                                    while (run)
                                    {
                                        parameterizedThreadStart(obj);
                                    }
                                });
        }
 
        public void Start()
        {
            run = true;
            thread.Start();
        }
 
        public void Start(object obj)
        {
            thread.Start(obj);
        }
 
        public void Stop()
        {
            run = false;
        }
    }
задаешь задачу, он её будет делать, пока не отменишь. Но рекурсивный вызов из finally нужно будет убрать, и без него будет работать.
1
3664 / 2576 / 718
Регистрация: 02.08.2011
Сообщений: 6,947
21.02.2014, 21:27 6
Оо, забыл, есть же еще СancellationTokenSource class.
1
21.02.2014, 21:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2014, 21:27
Помогаю со студенческими работами здесь

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

Правильная остановка потока
Есть поток, в которым выполняется запрос. При закрытии формы, нужно останавливать выполнение этого...

Остановка потоков
Привет всем, я новичок на этом форуме и мне нужна Ваша помощь. У меня есть многопоточное...

Остановка потоков
Вот такой вопрос: Допустим есть 1 класс, наследуемый от Runable: //поток слежения за временем...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru