|
Как стартануть произвольное число потоков, затем одновременно их прервать?
|
|||
---|---|---|---|
#18+
Есть у меня набор функций. При каждом нажатии на кнопку "Расчёт" запускается произвольное число из этих функций (в зависимости от выбранных настроек пользователя) - каждая в своём потоке. При запуске нового расчёта нужно остановить все предыдущие разом. Как это сделать? Я пока делаю так: имею список всех запущенных потоков расчёта List<Thread> calcThreads; и по мере запуска функций в потоках добавляю эти потоки в список. После запуска нового расчёта сначала прохожусь форичем по calcThreads и делаю Abort для каждого потока (я знаю об особенностях применения этой функции, но это сейчас не главное). Есть какой-то более элегантный и способ? На Task'ах, может быть? Останавливать потоки мне нужно потому, что они юзают некий общий ресурс. И если я начну новый расчёт без остановки старого, то в этом общем ресурсы будут перепутываться данные с предыдущим расчётом. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 07:49 |
|
Как стартануть произвольное число потоков, затем одновременно их прервать?
|
|||
---|---|---|---|
#18+
Smith27Есть у меня набор функций. При каждом нажатии на кнопку "Расчёт" запускается произвольное число из этих функций (в зависимости от выбранных настроек пользователя) - каждая в своём потоке. При запуске нового расчёта нужно остановить все предыдущие разом. Как это сделать? Я пока делаю так: имею список всех запущенных потоков расчёта List<Thread> calcThreads; и по мере запуска функций в потоках добавляю эти потоки в список. После запуска нового расчёта сначала прохожусь форичем по calcThreads и делаю Abort для каждого потока (я знаю об особенностях применения этой функции, но это сейчас не главное). Есть какой-то более элегантный и способ? На Task'ах, может быть? Останавливать потоки мне нужно потому, что они юзают некий общий ресурс. И если я начну новый расчёт без остановки старого, то в этом общем ресурсы будут перепутываться данные с предыдущим расчётом. По феншую это делается действительно в Tasks при помощи CancellationToken ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 10:35 |
|
Как стартануть произвольное число потоков, затем одновременно их прервать?
|
|||
---|---|---|---|
#18+
blestПо феншую это делается действительно в Tasks при помощи CancellationToken Именно. Дополню: вся груздь-доска этого решения в том, что мелкософт до сих пор не придумала ничего умного в свете "отмены задач" - практически, ТЫ САМ делаешь ручной закат солнца (оттого их решения и кажутся уродцами и вызывают сомнения в адекватности употребления). По идее, решение должно быть что-то вроде этого: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
И тут при вызове Abort() рантайм сам должен как-то нажать на красную кнопку, чтобы изнутри thread{} сработал ThreadAbortException. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2015, 18:32 |
|
Как стартануть произвольное число потоков, затем одновременно их прервать?
|
|||
---|---|---|---|
#18+
Poke, ничего не понял. Так, вроде, так и происходит - почитал в МСДНе про Abort - он кидает эксепшен внутри треда, по которому вызван аборт, и потом ещё кидает в catch, чтобы была возможность прервать аборт, если надо. https://msdn.microsoft.com/en-us/library/ty8d3wta(v=vs.110).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2015, 05:57 |
|
Как стартануть произвольное число потоков, затем одновременно их прервать?
|
|||
---|---|---|---|
#18+
Pokeвнутри thread{} Наверное, catch, а не thread? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2015, 05:59 |
|
Как стартануть произвольное число потоков, затем одновременно их прервать?
|
|||
---|---|---|---|
#18+
Smith27Pokeвнутри thread{} Наверное, catch, а не thread? Товарищ изобретает новый синтаксис. А вообще правильней кнопку "Расчет" блокировать, пока предыдущий не завершится. Либо, особенно если в расчетах циклы, воспользоваться как предложили выше Task+CancellationToken. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2015, 11:49 |
|
|
start [/forum/topic.php?fid=20&fpage=72&tid=1401042]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 295ms |
total: | 415ms |
0 / 0 |