powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как на основе CancellationToken сделать 2 CancellationToken ?
13 сообщений из 13, страница 1 из 1
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656322
Pruvetik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.

Мне нужно, чтобы два объекта останавливались последовательно, в строго определенном порядке.
Просто первый из них обращается ко второму, и нужно защитится от ситуации, что второй остановится раньше (многопоточность же), а первый успеет обратится ко второму, обратившись по null адресу.

Оба эти объекта создаются внешним объектом (в его конструкторе).

Можно ли как-то разделить CancellationToken на 2 отдельных CancellationToken и их уже передать в порождаемые классы ?
Я не увидел у CancellationToken каких-то событий, к которым бы можно было подцепится.

Как быть ?
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656363
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pruvetik,
мне кажется Вы не догоняете немного
авторМожно ли как-то разделить CancellationToken на 2 отдельных CancellationToken
получайте CancellationToken из фабрики CancellationTokenSource вы там можете получить их хоть сколько
в виде структуры и распихать по потокам
кде в потоке они будут сидеть в конце работы в виде
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
  bool run = true;
                           while (run)
                           {
                               if (((CancellationToken)st).IsCancellationRequested)
                               {
                                   run = false;
                               }
                           }
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656367
Pruvetik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи,

Из какой фабрики получать ?
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656368
Pruvetik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pruvetik,

Я хочу уточнить, что никто извне класса не знает, что он там внутри себя создает еще 2 подкласса.

В принципе я могу переделать код как угодно. Но что тогда предавать в класс ? Сейчас передаю CancellationTokenSource - и используется его свойство Token.

Что еще можно передать, чтобы класс мог разделить на отдельные токены и вызывать их в нужной последовательности ?
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656370
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pruvetik, минутку
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656374
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
 class Program
    {
        static void Main(string[] args)
        {
            var s = new CancellationTokenSource();
          
            new Thread(st =>
                       {
                           while (!((CancellationToken)st).IsCancellationRequested)
                               ;

                           Console.Write("stop1");
                       }).Start(s.Token);

            new Thread(st =>
                       {
                           var i = 0;
                           while (i < 2000000000) i++;
                           ((CancellationTokenSource)st).Cancel();
                           Console.Write("stop2");
                       }).Start(s);
            Console.Read();
        }
    }
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656390
Pruvetik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи,

Нет. У меня другое.
И честно говоря, уже появилась идея, что нужно делать.

У меня вот, что:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public class MainClass
    {
        private WorkerClass class1;
        private WorkerClass class2;

        public MainClass(CancellationTokenSource cts)
        {
            class1 = new WorkerClass(cts);
            class2 = new WorkerClass(cts);
        }
    }



Сейчас оба класса мониторят один и тот же cts.
Следовательно порядок их останова - совершенно случаен.

Мне же нужно, чтобы обязательно был остановлен сначала class1 , а потом class2.


В общем. Я уже понимаю, что мне нужно сделать.
Нужно чтобы MainClass прослушивал переданный cts - и создал два новых CancellationTokenSource , и их уже передал в class1 и class2 соответственно.
И когда сработает оригинальный cts, MainClass вызовет cancel в нужном порядке у двух созданных CancellationTokenSource. Все выйдет замечательно.

Че то голова уже под вечер не варит. В принципе так и нужно было сразу сделать. Но Вам спасибо за помощь в любом случае !
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656397
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pruvetik,
если честно, мне не очень нравится реализация с этим кооперативным шлагбаумом.
я бы сделал проще два делегата as два потока из пула
а управлять то ими одно удовольствие: хош из первого результат второго вызови - хош наоборот..
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656403
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще мне не нравится вся озабоченность временем выполнения потока, передавайте в поток указатель на функцию
и выводите через нее результат наружу, или еще как , поток должен умереть после работы, а не плющить процессор в ожидании команды.
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656408
Pruvetik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи,

Спасибо за предложение.

Но я планировал уже с TPL все организовать. Мне это кажется сейчас проще, чем с обычными тредами.
Каждый из классов WorkerClass - это тоже отдельный поток ведь.
Нужно не забывать про возникающие исключения. А в Task'ах с ними просто работать.

Даже если делать через треды, суть не меняется - мне обязательно нужно, чтобы сначала один завершился, а потом второй.

Я сделаю это примерно так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
cts1.cancel ();
// class1 обращается к class2 - поэтому его нужно остановится первым
try
{
class1.Wait(); // Ждем, чтобы класс точно завершился
}
catch (Exception Exe)
{
...
}
finally
{
  cts2.cancel();
  class2.Wait();
}



получится ли так просто с тредами ? С учетом всяких там возникающих исключений - тут они четко на методе Wait вылетят, а в обычных тредах гораздо не удобней.
Task вообще можно передать куда нибудь, и там уже ловить исключения.

А с тредами получится ли ? Ну если только через лямбды да Action'ы наверное.

В общем TPL мне видится более чистым (с точки зрения кучи кода) решением.
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38656440
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pruvetik,
авторКаждый из классов WorkerClass - это тоже отдельный поток ведь.
бред какой то.
авторМне это кажется сейчас проще, чем с обычными тредами.
кто ж вас заставляет с тредами то, когда пул готовых под боком?
у вас два потока, а предположим их 12, и организовать поочередную остановку, так вот у вас с двумя то крышу вынесло.
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38657011
Pruvetik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи,

Почему бред то ? :)
Я слыхал в WinRT так и вовсе ВСЕ асинхронное. Подробностей не знаю, но как я понял каждый метод через async создает кучу других потоков, которые создают еще кучу потоков. Живет вроде бы это как-то.
...
Рейтинг: 0 / 0
Как на основе CancellationToken сделать 2 CancellationToken ?
    #38657072
Pruvetik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А то, что крышу снесло - ну я то теперь уже все понял как нужно :). Все просто получается на самом деле.
Main class должен сам отслеживать токен отмены, при этом он должен создать свои токены - сколько нужно (за сколько он там классов отвечает).
После того как Main class ловит команду останова от своего токена, он уже сам, в нужном порядке останавливает свои классы. Все просто и по ООП :) Каждый класс отвечает только за свои внутренности, а снаружи всем вообще не интересно как там устроено.

В итоге сложностей нету - просто создаем нужное количество токенов и потом вызываем их в нужном порядке.
Главное не забывать ждать завершения задачи через Task.Wait(), понятно же, что поток проверяет токен отмены только когда может (не делает какую-то операцию). Но если классы друг от друга не зависят, то вообще нет нужды ждать поочередного завершения.

Код я привел.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как на основе CancellationToken сделать 2 CancellationToken ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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