Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
20 / 5 / 6
Регистрация: 31.05.2015
Сообщений: 119
1

Не выставляется правильный статус Task при отмене через токен

25.08.2019, 08:44. Показов 925. Ответов 3
Метки tpl (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Пытаюсь сделать отмену Task-а через токен.
В результате выполнение метода нормально прерывается, но статус задания остается Running, и, соответственно, IsCanceled, IsCompleted и IsFaulted имеют значение false.
Подскажите, плз, в чем ошибка.
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
25
26
27
28
29
30
31
32
33
34
35
36
static void Main(string[] args)
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            var t = Task.Run
            (
                () =>
                {
                    Method(cts.Token);
                    cts.Token.ThrowIfCancellationRequested();
                },
                cts.Token
            );
            while (Console.ReadKey().Key != ConsoleKey.Enter)
            {
 
            }
            cts.Cancel();
            
            Console.WriteLine("Главный поток");
            Console.WriteLine(t.Status);
            
            Console.WriteLine($"{t.IsCanceled}   {t.IsCompleted}   {t.IsFaulted}");
            Console.ReadKey();
        }
 
        static void Method(CancellationToken token)
        {
            int c = 0;
            while(!token.IsCancellationRequested)
            {
                Console.Clear();
                Console.WriteLine(c++);
                Console.WriteLine("Нажмите ENTER для отмены");
                Thread.Sleep(300);
            }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2019, 08:44
Ответы с готовыми решениями:

Ошибка в отмене задачи (Task)
Доброго времени суток) На данный момент изучаю многопоточность, а именно отмена выполнения задач...

Ошибка при отмене сохранения файла через SaveFileDialog
Создаю файл Word и сохраняю его при помощи SaveFileDialog ' Create Word Application Dim...

Скрипт должен брать из БД токен, и устанавливать пользователю статус на страницу ВКонтакте
Уважаемые форумчани! Недавно стал осваивать php , вот мне понадобилось создать сервис АвтоСтатуса...

Как узнать статус Task-a из другого метода
хочу сделать что то типа такого , но условия видимости не позволяют private void...

3
HF
1163 / 749 / 181
Регистрация: 09.09.2011
Сообщений: 2,313
Записей в блоге: 2
25.08.2019, 09:46 2
Вы делаете отмену непонятно где и как. Вот документация и пример:
Практическое руководство. Прослушивание запросов на отмену посредством опросов
0
20 / 5 / 6
Регистрация: 31.05.2015
Сообщений: 119
25.08.2019, 12:06  [ТС] 3
При запуске кода из документации IsCancelled все равно false.

Немного переделал код (отмена задания через 3 сек.). Результат тот же, причем во внешнем потоке не отлавливается исключение.
При этом, если убрать весь код между Task.Run и Cancel() (т.е. отменить сразу запуска после Task.Run), то IsCancelled становится True (исключение все равно не отлавливается)

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    class Program
    {
        static void Main(string[] args)
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            Task t = null;
            try
            {
                t = Task.Run(() => Method(cts.Token), cts.Token);
            }
            catch(TaskCanceledException ex)
            {
                Console.WriteLine("Отменено");
            }
 
            Thread.Sleep(3000);
            cts.Cancel();
            
            Console.WriteLine("Главный поток");
            Console.WriteLine(t.Status);
            
            Console.WriteLine($"{t.IsCanceled}   {t.IsCompleted}   {t.IsFaulted}");
            Console.ReadKey();
        }
 
        static void Method(CancellationToken token)
        {
            int c = 0;
            while(!token.IsCancellationRequested)
            {
                Console.Clear();
                Console.WriteLine(c++);
                Console.WriteLine("Нажмите ENTER для отмены");
                Thread.Sleep(300);
            }
            token.ThrowIfCancellationRequested();
        }
    }
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
25.08.2019, 14:06 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        static async Task Main(string[] args)
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            Task t = Task.Run(() => Method(cts.Token), cts.Token);
 
            await Task.Delay(3000);
            cts.Cancel();
 
            try
            {
                await t;
            }
            catch(TaskCanceledException ex)
            {
                Console.WriteLine("Отменено");
            }
            
            Console.WriteLine("Главный поток");
            Console.WriteLine(t.Status);
            
            Console.WriteLine($"{t.IsCanceled}   {t.IsCompleted}   {t.IsFaulted}");
            Console.ReadKey();
        }
0
25.08.2019, 14:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2019, 14:06
Помогаю со студенческими работами здесь

Консольное приложение не создает файлы при запуске через Task Scheduler
Есть консольное приложение не C#. Работает с базои данных, собирает данные, записывает в фаилы....

Ошибка при отмене сохранения файла
private void button2_Click(object sender, EventArgs e) { var sfd = new...

Ошибка при отмене ввода в MaskEdit
Доброго времени суток! Задаю MaskEdit параметр EditMask Проверяю... все вводиться! Но если...

Файл закрывается при отмене сохранения
Здравствуйте. Пишу вот тут Текстовий редактор (курсач :) ) и такая ошибочка Когда Нажимаю закрыть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru