Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
29.05.2014, 19:39
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Привет. Мне нужно, чтобы два объекта останавливались последовательно, в строго определенном порядке. Просто первый из них обращается ко второму, и нужно защитится от ситуации, что второй остановится раньше (многопоточность же), а первый успеет обратится ко второму, обратившись по null адресу. Оба эти объекта создаются внешним объектом (в его конструкторе). Можно ли как-то разделить CancellationToken на 2 отдельных CancellationToken и их уже передать в порождаемые классы ? Я не увидел у CancellationToken каких-то событий, к которым бы можно было подцепится. Как быть ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 20:22
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Pruvetik, мне кажется Вы не догоняете немного авторМожно ли как-то разделить CancellationToken на 2 отдельных CancellationToken получайте CancellationToken из фабрики CancellationTokenSource вы там можете получить их хоть сколько в виде структуры и распихать по потокам кде в потоке они будут сидеть в конце работы в виде Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 20:27
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Где-то в степи, Из какой фабрики получать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 20:29
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Pruvetik, Я хочу уточнить, что никто извне класса не знает, что он там внутри себя создает еще 2 подкласса. В принципе я могу переделать код как угодно. Но что тогда предавать в класс ? Сейчас передаю CancellationTokenSource - и используется его свойство Token. Что еще можно передать, чтобы класс мог разделить на отдельные токены и вызывать их в нужной последовательности ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 20:31
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Pruvetik, минутку ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 20:36
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 20:54
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Где-то в степи, Нет. У меня другое. И честно говоря, уже появилась идея, что нужно делать. У меня вот, что: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Сейчас оба класса мониторят один и тот же cts. Следовательно порядок их останова - совершенно случаен. Мне же нужно, чтобы обязательно был остановлен сначала class1 , а потом class2. В общем. Я уже понимаю, что мне нужно сделать. Нужно чтобы MainClass прослушивал переданный cts - и создал два новых CancellationTokenSource , и их уже передал в class1 и class2 соответственно. И когда сработает оригинальный cts, MainClass вызовет cancel в нужном порядке у двух созданных CancellationTokenSource. Все выйдет замечательно. Че то голова уже под вечер не варит. В принципе так и нужно было сразу сделать. Но Вам спасибо за помощь в любом случае ! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 21:06
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Pruvetik, если честно, мне не очень нравится реализация с этим кооперативным шлагбаумом. я бы сделал проще два делегата as два потока из пула а управлять то ими одно удовольствие: хош из первого результат второго вызови - хош наоборот.. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 21:17
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Еще мне не нравится вся озабоченность временем выполнения потока, передавайте в поток указатель на функцию и выводите через нее результат наружу, или еще как , поток должен умереть после работы, а не плющить процессор в ожидании команды. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 21:28
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Где-то в степи, Спасибо за предложение. Но я планировал уже с TPL все организовать. Мне это кажется сейчас проще, чем с обычными тредами. Каждый из классов WorkerClass - это тоже отдельный поток ведь. Нужно не забывать про возникающие исключения. А в Task'ах с ними просто работать. Даже если делать через треды, суть не меняется - мне обязательно нужно, чтобы сначала один завершился, а потом второй. Я сделаю это примерно так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
получится ли так просто с тредами ? С учетом всяких там возникающих исключений - тут они четко на методе Wait вылетят, а в обычных тредах гораздо не удобней. Task вообще можно передать куда нибудь, и там уже ловить исключения. А с тредами получится ли ? Ну если только через лямбды да Action'ы наверное. В общем TPL мне видится более чистым (с точки зрения кучи кода) решением. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.05.2014, 22:19
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Pruvetik, авторКаждый из классов WorkerClass - это тоже отдельный поток ведь. бред какой то. авторМне это кажется сейчас проще, чем с обычными тредами. кто ж вас заставляет с тредами то, когда пул готовых под боком? у вас два потока, а предположим их 12, и организовать поочередную остановку, так вот у вас с двумя то крышу вынесло. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.05.2014, 13:53
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
Где-то в степи, Почему бред то ? :) Я слыхал в WinRT так и вовсе ВСЕ асинхронное. Подробностей не знаю, но как я понял каждый метод через async создает кучу других потоков, которые создают еще кучу потоков. Живет вроде бы это как-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.05.2014, 14:27
|
|||
---|---|---|---|
|
|||
Как на основе CancellationToken сделать 2 CancellationToken ? |
|||
#18+
А то, что крышу снесло - ну я то теперь уже все понял как нужно :). Все просто получается на самом деле. Main class должен сам отслеживать токен отмены, при этом он должен создать свои токены - сколько нужно (за сколько он там классов отвечает). После того как Main class ловит команду останова от своего токена, он уже сам, в нужном порядке останавливает свои классы. Все просто и по ООП :) Каждый класс отвечает только за свои внутренности, а снаружи всем вообще не интересно как там устроено. В итоге сложностей нету - просто создаем нужное количество токенов и потом вызываем их в нужном порядке. Главное не забывать ждать завершения задачи через Task.Wait(), понятно же, что поток проверяет токен отмены только когда может (не делает какую-то операцию). Но если классы друг от друга не зависят, то вообще нет нужды ждать поочередного завершения. Код я привел. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&mobile=1&tid=1402870]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 365ms |
total: | 500ms |
0 / 0 |