2 / 2 / 0
Регистрация: 15.05.2011
Сообщений: 50
1

Остановить массив потоков

13.06.2015, 19:30. Показов 1908. Ответов 3
Метки нет (Все метки)

Здравствуйте, есть проблема при работе с многопоточностью в моем (простите Г.) коде. Знаю, что вся реализация крайне убога (я еще совсем не опытен, только учусь...). Так вот, при попытке завершить потоки с помощью метода StopThreads программа каким-то образом зацикливается и потоки продолжают выполняться (не все). Огромная просьба: если есть возможность как ЭТО заставить работать, т.к. сами методы значительно больше чем приведенные примеры и подсказать с помощь чего это все Г. можно было нормально реализовать?
есть некий метод отправки запроса (к примеру):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void doRequest(object o)
{
    string str = o as string;
    if (str == null)
        return;
    using (var request = new HttpRequest())
    {
        request.UserAgent = HttpHelper.ChromeUserAgent();
 
        // Отправляем запрос.
        try
        {
            HttpResponse response = request.Get(str);
            // Принимаем тело сообщения в виде строки.
            string content = response.ToString();
            StopThreads();
        }
        catch(Exception e)
        {
            MessageBox(e.Message);
        }
    }
}
также есть массив List<string> sites в котором адреса сайтов, массив потоков List<Threads> threads и указатель на потенциальный поток в котором запустится многопоточность multithreads.
Есть метод который в отдельном потоке запускает массив потоков и диалоговое окно в котором есть обработчик событий прогресса, а также метод остановки методов при успешном получения ответа от сервера, допустим кол-во сайтов и массив потоков одинаков.
пример метода многопоточного запуска запросов:
C#
1
2
3
4
5
6
7
8
9
private void doMultiThreadsRequest()
{
    for (int i=0; i < threadsCountAndSitesCount; i++)
    {
        threads[i] = new Thread(doRequest);
        threads[i].IsBackground = true;
        threads[i].Start(str[i]);
    }
}
пример метода запуска многопоточной отправки запросов и показа формы, в которую приходят события прогресса:
C#
1
2
3
4
5
public void StartMultiThreads()
{
    doMultiThreadsRequest();
    Form2.ShowDialog();
}
и пример метода остановки потоков вызывающейся при успешном запросе:
C#
1
2
3
4
5
6
7
8
9
10
private StopThreads()
{
    if (multithreads!=null && multithreads.IsAlive)
        multithreads.Abort();
    for (int i=0; i < threadsCountAndSitesCount; i++)
    {
        if (threads[i].IsAlive)
            threads[i].Abort();
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2015, 19:30
Ответы с готовыми решениями:

Запустить и остановить N потоков
Thread thread = new Thread(Check); public bool Start(int flow) { ...

Остановить пул потоков
Добрый день. Есть такая проблема: Создается пул потоков, 2 потока выводят информацию в listbox и...

Массив потоков <thread>
Последний раз потоки писал на C под Linux. И там прокатывала такая штука thread a; for(int...

Возможно ли создать массив потоков
А возможно ли создать массив потоков, или лист потоков. Типа: List&lt;Thread&gt; threads = new...

3
141 / 117 / 26
Регистрация: 07.12.2014
Сообщений: 371
13.06.2015, 20:48 2
Лучший ответ Сообщение было отмечено thefair как решение

Решение

Я бы Вам порекомендовал почитать про Task'и и асинхронность с помощью async/await.Это более актуальные на данный момент технологии
1
2 / 2 / 0
Регистрация: 15.05.2011
Сообщений: 50
15.06.2015, 19:06  [ТС] 3
Vigelforts, Спасибо за наводку, хотелось бы, конечно, еще какие-то примеры но гугл пришел мне на помощь.
Вот хорошие примеры:
https://msdn.microsoft.com/ru-... 55756.aspx
https://msdn.microsoft.com/ru-... 55758.aspx
Есть конечно же куча нюансов, самый главный (не считая кучи прочитанных статей и не докуривание темы в целом) - нужно самому в async методе отслеживать запрос отмены и выходить из него...
0
Эксперт .NET
16929 / 12506 / 3286
Регистрация: 17.09.2011
Сообщений: 20,743
15.06.2015, 19:19 4
Цитата Сообщение от thefair Посмотреть сообщение
самый главный - нужно самому в async методе отслеживать запрос отмены и выходить из него.
Это не нюанс, а единственно верный способ завершения работы потока.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2015, 19:19
Помогаю со студенческими работами здесь

Массив или лист потоков?
Масив или лист потоков ? что лучше создать ?

Массив потоков работает весьма некорректно
Ребят, помогите разобраться. Есть код: public void Processor(int i, int j,DataGridView a,...

Массив threads: как запустить 10 потоков?
Метод оформил: protected: virtual void run(); void Class::run() { }

Массив потоков. Максимально быстрое выполнение
Добрый день. Стоит такая задача: Максимально быстро циклически выполнять определенный метод в...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru