powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как стартануть произвольное число потоков, затем одновременно их прервать?
6 сообщений из 6, страница 1 из 1
Как стартануть произвольное число потоков, затем одновременно их прервать?
    #39105138
Smith27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня набор функций. При каждом нажатии на кнопку "Расчёт" запускается произвольное число из этих функций (в зависимости от выбранных настроек пользователя) - каждая в своём потоке. При запуске нового расчёта нужно остановить все предыдущие разом. Как это сделать?

Я пока делаю так: имею список всех запущенных потоков расчёта

List<Thread> calcThreads;

и по мере запуска функций в потоках добавляю эти потоки в список. После запуска нового расчёта сначала прохожусь форичем по calcThreads и делаю Abort для каждого потока (я знаю об особенностях применения этой функции, но это сейчас не главное). Есть какой-то более элегантный и способ? На Task'ах, может быть?

Останавливать потоки мне нужно потому, что они юзают некий общий ресурс. И если я начну новый расчёт без остановки старого, то в этом общем ресурсы будут перепутываться данные с предыдущим расчётом.
...
Рейтинг: 0 / 0
Как стартануть произвольное число потоков, затем одновременно их прервать?
    #39105282
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smith27Есть у меня набор функций. При каждом нажатии на кнопку "Расчёт" запускается произвольное число из этих функций (в зависимости от выбранных настроек пользователя) - каждая в своём потоке. При запуске нового расчёта нужно остановить все предыдущие разом. Как это сделать?

Я пока делаю так: имею список всех запущенных потоков расчёта

List<Thread> calcThreads;

и по мере запуска функций в потоках добавляю эти потоки в список. После запуска нового расчёта сначала прохожусь форичем по calcThreads и делаю Abort для каждого потока (я знаю об особенностях применения этой функции, но это сейчас не главное). Есть какой-то более элегантный и способ? На Task'ах, может быть?

Останавливать потоки мне нужно потому, что они юзают некий общий ресурс. И если я начну новый расчёт без остановки старого, то в этом общем ресурсы будут перепутываться данные с предыдущим расчётом.

По феншую это делается действительно в Tasks при помощи CancellationToken
...
Рейтинг: 0 / 0
Как стартануть произвольное число потоков, затем одновременно их прервать?
    #39107101
Poke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blestПо феншую это делается действительно в Tasks при помощи CancellationToken

Именно. Дополню: вся груздь-доска этого решения в том, что мелкософт до сих пор не придумала ничего умного в свете "отмены задач" - практически, ТЫ САМ делаешь ручной закат солнца (оттого их решения и кажутся уродцами и вызывают сомнения в адекватности употребления). По идее, решение должно быть что-то вроде этого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
// псевдокод
var t = Task.Start(WorkHorse);// запустили трэд
// очнулись
t.Abort();
////////// где-то в далёкой галактике \\\\\\\\\\\
void WorkHorse()
{
    thread {
        // что-то делаем
        // ещё что-то делаем и мы НЕ ЗНАЕМ, когда нас остановят!!
    } catch(ThreadAbortException taex) {
        // завершаем работу, освобождаем ресурсы и т.п.
    } catch(Exception ex) {
        // ого! неожиданный фэйл, обрабатываем.
    }
}



И тут при вызове Abort() рантайм сам должен как-то нажать на красную кнопку, чтобы изнутри thread{} сработал ThreadAbortException.
...
Рейтинг: 0 / 0
Как стартануть произвольное число потоков, затем одновременно их прервать?
    #39107313
Smith27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Poke,

ничего не понял. Так, вроде, так и происходит - почитал в МСДНе про Abort - он кидает эксепшен внутри треда, по которому вызван аборт, и потом ещё кидает в catch, чтобы была возможность прервать аборт, если надо.

https://msdn.microsoft.com/en-us/library/ty8d3wta(v=vs.110).aspx
...
Рейтинг: 0 / 0
Как стартануть произвольное число потоков, затем одновременно их прервать?
    #39107314
Smith27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pokeвнутри thread{}
Наверное, catch, а не thread?
...
Рейтинг: 0 / 0
Как стартануть произвольное число потоков, затем одновременно их прервать?
    #39107553
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smith27Pokeвнутри thread{}
Наверное, catch, а не thread?
Товарищ изобретает новый синтаксис.
А вообще правильней кнопку "Расчет" блокировать, пока предыдущий не завершится.
Либо, особенно если в расчетах циклы, воспользоваться как предложили выше Task+CancellationToken.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как стартануть произвольное число потоков, затем одновременно их прервать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]