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

Узнай цену своей работы

Формулировка задачи:

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

CancellationToken

. эксепшен вылетает (и сместе с ним приложение крешится) на строке вызова этого самого эксепшена.
cancellationToken.ThrowIfCancellationRequested();
"OperationCanceledException was unhandled by user code" Как пишут тут http://stackoverflow.com/questions/1...rallel-foreach http://stackoverflow.com/questions/7...g-an-exception должно решаться это использованием try {} catch(){}, что логично и сразу же пробовал, но не помогает. Вот полный код Worker.cs
    
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
        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));
        }

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

textual
Листинг программы
        public void HardStop()
        {
            try
            {
                using (wtoken)
                {
                    wtoken.Cancel();
                }
                wtoken = new CancellationTokenSource();
                tasks = null;
            }
            catch (Exception ex) { exception = ex.Message; }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5