Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятна суть CancellationToken.None 
:(
    Опции темы
lllJollyRogerlll
Дата 5.10.2017, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 20.11.2014

Репутация: нет
Всего: нет



Доброго времени суток.
Прошу объяснить деревянному, почему в данном случает отрабатывает метод обратного вызова?
Код

            CancellationTokenSource cts = new CancellationTokenSource();
            cts.Token.Register(() => Console.WriteLine("The loop was canceled!"));
            ThreadPool.QueueUserWorkItem((o) => {
                CancellationToken token = (CancellationToken)o;
                for (int i = 0; i < 10; i++)
                {
                    if (token.IsCancellationRequested) break;
                    Console.WriteLine(i);
                    Thread.Sleep(200);
                }
            }, CancellationToken.None);
            Console.WriteLine("Hit enter in order to stop the loop");
            Console.ReadLine();
            cts.Cancel();

Ведь статическое св-во CancellationToken.None передает токен, который не содержит ссылки на его соурс. То есть впринципе мы не можем строкой cts.Cancel(); отменить выполнение цикла. А в жизни выходит все в точности наоборот.
См. скрин ниже
user posted image
PM MAIL   Вверх
mihryak
Дата 12.10.2017, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Весь код приведи, плз, в т.ч. вызывающий твой кусок кода.
Подозреваю, что "Press any key to continue" - последний вывод сообщения в программе, после чего она завершается. В том случае нет никакого чуда:
1. Запускается задача на печать чисел 
2. Вызывающий поток блочится вызовом Console.ReadLine();
3. Пользователь жмёт кнопку
4. Основной поток продолжает работу
5. Основной поток вызывает cts.Cancel();, что выводит на экран "was cancelled"
6. Это, вероятно, последняя "рабочая" инструкция основного потока, после чего выводится "Press any key to continue".
7. Т.к. потоки из пула имеют свойство IsBackground=false, они автоматически завершаются при завершении вызывающего (у нас - основного) потока, наша поточная функция попросту завершеается примерно на том моменте, когда пользователь нажал enter

PM MAIL ICQ   Вверх
lllJollyRogerlll
Дата 15.10.2017, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 20.11.2014

Репутация: нет
Всего: нет



Доброго времени суток. Все точно так и есть. Спасибо большое что разжевали! 
Цитата(mihryak @ 12.10.2017,  19:13)
Весь код приведи, плз, в т.ч. вызывающий твой кусок кода.
Подозреваю, что "Press any key to continue" - последний вывод сообщения в программе, после чего она завершается. В том случае нет никакого чуда:
1. Запускается задача на печать чисел 
2. Вызывающий поток блочится вызовом Console.ReadLine();
3. Пользователь жмёт кнопку
4. Основной поток продолжает работу
5. Основной поток вызывает cts.Cancel();, что выводит на экран "was cancelled"
6. Это, вероятно, последняя "рабочая" инструкция основного потока, после чего выводится "Press any key to continue".
7. Т.к. потоки из пула имеют свойство IsBackground=false, они автоматически завершаются при завершении вызывающего (у нас - основного) потока, наша поточная функция попросту завершеается примерно на том моменте, когда пользователь нажал enter

PM MAIL   Вверх
Google
  Дата 17.10.2017, 14:24 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0915 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.