С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 125

Завершение массива задач Task с использованием CancellationToken

19.11.2014, 21:00. Показов 2991. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В продолжение темы.
Передача метода в класс BackgroundWorker
к Backgroundworker это уже не относится.

Вроде как и все нормально, спасибо за помощь, но уткнулся в странный эксепшен на завершении Tasks через CancellationToken.

эксепшен вылетает (и сместе с ним приложение крешится) на строке вызова этого самого эксепшена.
C#
1
cancellationToken.ThrowIfCancellationRequested();
"OperationCanceledException was unhandled by user code"

Как пишут тут
http://stackoverflow.com/quest... el-foreach
http://stackoverflow.com/quest... -exception
должно решаться это использованием try {} catch(){}, что логично и сразу же пробовал, но не помогает.

Вот полный код
Worker.cs
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
39
40
41
42
43
    
class Worker
    {
        public static int threadCount { get; set; }
        Task[] tasks;
 
        //ex data
        public static string exception;
 
        static CancellationTokenSource wtoken = new CancellationTokenSource();
        CancellationToken cancellationToken = wtoken.Token;
        public void doWork(ParameterizedThreadStart method)
        {
            try
            {
                tasks = Enumerable.Range(0, threadCount).Select(i => Task.Factory.StartNew(() =>
                {
                    while (true)
                    {
                        if (tasks[i].IsFaulted == true) { break; }
                        cancellationToken.ThrowIfCancellationRequested(); 
                        method(i);
                    }
                }, cancellationToken)).ToArray();
            }
            catch (Exception ex) { exception = ex.Message; }
        }
 
 
        public void HardStop()
        {
            try
            {
                using (wtoken)
                {
                wtoken.Cancel();
                }
                wtoken = null;
                tasks = null;
            }
            catch (Exception ex) { exception = ex.Message; }
        }
    }
Form1.cs
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
        private void Start_btn_Click(object sender, EventArgs e)
        {
            Worker.threadCount = 4;
            Worker worker = new Worker();
            worker.doWork(Job);
 
            string logString_1 = string.Format("Starting {0} threads...", Worker.threadCount);
            log(logString_1);
 
        }
 
        public static int j = 0;
        private void Job(object sender)
        {
            Worker worker = new Worker();
            Random r = new Random();
 
            log("Thread "+Thread.CurrentThread.ManagedThreadId +" is working...");
            for (int i = 0; i < 5; i++)
            {
                j++;
                log("J==" + j);
                if (j == 50)
                {
                    worker.HardStop();
                    log("STOP");
                }
                
            }
            Thread.Sleep(r.Next(500, 1000));
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.11.2014, 21:00
Ответы с готовыми решениями:

Реализовать взаимодействие клиент-сервер с использованием задач (Task)
Реализовать ситуацию взаимодействия по типу клиент-сервер с использованием задач (Task). Для этого требуется: 1. Объявить класс...

BlockingCollection<T>, Add(T item, CancellationToken cancellationToken);
Возник вопрос в механизме метода Add() BlockingCollection. В реализации BlockingCollection есть возможность добавить как элемент...

CancellationToken.Cancel() отменяет весь поток задач, созданных TaskFactory
В общем, есть таскфактори, связанный с TaskScheduler(создавал его разными конструкторами), например, сейчас выглядит так: _factory = new...

4
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 125
21.11.2014, 04:58  [ТС]
решил так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public void doWork(ParameterizedThreadStart method)
        {
            try
            {
                tasks = Enumerable.Range(0, threadCount).Select(i => Task.Factory.StartNew(() =>
                {
                    while (!cancellationToken.IsCancellationRequested)
                    {
                        method(i);
                    }
                }, cancellationToken)).ToArray();
            }
            catch (Exception ex) { exception = ex.Message; }
        }
с cancellationToken.ThrowIfCancellationReq uested();
не могу заставить работать, все же пишут что через этот эксепшен лучше завершать.
0
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 125
27.11.2014, 20: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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    class Worker
    {
        public static int threadCount { get; set; }
        Task[] tasks;
 
        //ex data
        public static string exception;
 
        static CancellationTokenSource wtoken = new CancellationTokenSource();
        CancellationToken cancellationToken = wtoken.Token;
        public void doWork(ParameterizedThreadStart method)
        {
            try
            {
                tasks = Enumerable.Range(0, threadCount).Select(i => Task.Factory.StartNew(() =>
                {
                    while (!cancellationToken.IsCancellationRequested)
                    {
                        method(i);
                    }
                }, cancellationToken)).ToArray();
            }
            catch (Exception ex) { exception = ex.Message; }
        }
 
 
        public void HardStop()
        {
            try
            {
                using (wtoken)
                {
                    wtoken.Cancel();
                }
                wtoken = null;
                tasks = null;
            }
            catch (Exception ex) { exception = ex.Message; }
        }
    }
Если после того, как запускаю метод doWork() 1н раз, он нормально отрабатывает и потоки завершаются методом HardStop(), не закрывая окна софта запускаю метод doWork() еще раз - получаю ошибку "Ссылка на объект не указывает на экземпляр объекта."
здесь

C#
1
static CancellationTokenSource wtoken = new CancellationTokenSource();
предполагаю это из-за того что CancellationTokenSource - static. Однако
C#
1
CancellationToken cancellationToken
не может принимать non-static field

собственно, как можно решить эту проблему?
0
74 / 26 / 19
Регистрация: 13.10.2014
Сообщений: 89
27.11.2014, 23:41
Цитата Сообщение от opahopa Посмотреть сообщение
wtoken = null;
А заново-то его кто будет создавать?)

да еще перед этим кодом вот это
C#
1
2
3
4
using (wtoken)
                {
                    wtoken.Cancel();
                }
Что значит, что ты вызываешь Dispose для wtoken. Даблкилл!)
1
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 125
28.11.2014, 07:34  [ТС]
Цитата Сообщение от jumperAlex Посмотреть сообщение
C#
1
wtoken = null;
А заново-то его кто будет создавать?)
да еще перед этим кодом вот это
Код C#
C#
1
2
3
4
using (wtoken)
 {
 wtoken.Cancel();
 }
Что значит, что ты вызываешь Dispose для wtoken. Даблкилл!).
Спасибо,
Почему-то я был уверен, что
C#
1
wtoken
создаваться новый должен при вызове метода класса

Решил так топорно, но работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public void HardStop()
        {
            try
            {
                using (wtoken)
                {
                    wtoken.Cancel();
                }
                wtoken = new CancellationTokenSource();
                tasks = null;
            }
            catch (Exception ex) { exception = ex.Message; }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.11.2014, 07:34
Помогаю со студенческими работами здесь

Завершение Task с вызываемым методом
Вопрос такой: в программе запускается определенное количество Task'ов, которые в свою очередь вызывают метод. В методе я работаю с...

Программирование задач с использованием двумерного массива.
Заданы две матрицы A(n,n) и B (n,n). Сформулировать из них прямоугольную матрицу, включая в нечетные столбцы элементы матрицы A,в четные-...

диспетчер задач task manager
непонимаю как, но пропал диспетчер напроч, сначала не предавал значения но уже достаточно много вемени прошло и начинает напрягать...

Task Manager (Диспетчер задач) не отображает все вкладки
Форумчане и гости, хочу вот такой Диспетчер задач: А вместо этого у меня какой-то урезанный: Гугл не помог. Есть знающие? (OS...

Завершение процесса в диспетчере задач
Подскажите, как сделать так, чтобы при закрытии программы завершался процесс в диспетчере задач? Функционал программы предполагает...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru