Завершение массива задач Task с использованием CancellationToken - C#
Формулировка задачи:
В продолжение темы.
Передача метода в класс BackgroundWorker
к Backgroundworker это уже не относится.
Вроде как и все нормально, спасибо за помощь, но уткнулся в странный эксепшен на завершении Tasks через "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
Form1.cs
CancellationToken
. эксепшен вылетает (и сместе с ним приложение крешится) на строке вызова этого самого эксепшена.cancellationToken.ThrowIfCancellationRequested();
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; } } }
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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д