Правильно передать tokenSource в функцию с task - C#
Формулировка задачи:
Как передать правильно tokenSource в функцию? Сделать обертку с функцией где аргумент будет tokenSource и ее передавать в конструктор task? Или возможно что то типа этого: ( на данном этапе cancel не отрабатывает)
public class Program { static void Main(string[] args) { CancellationTokenSource cancelTokenSource = new CancellationTokenSource(); func(cancelTokenSource); cancelTokenSource.Cancel(); Console.ReadKey(); } static void func(CancellationTokenSource cancelTokenSource) { CancellationToken _token = cancelTokenSource.Token; int number = 6; Task task1 = new Task(() => { int result = 1; for (int i = 1; i <= number; i++) { if (_token.IsCancellationRequested) { _token.ThrowIfCancellationRequested(); } result *= i; Thread.Sleep(2000); //cancelTokenSource.Cancel(); } }, cancelTokenSource.Token); task1.Start(); try { task1.Wait(); Console.WriteLine(Convert.ToString(task1.Status)); Console.WriteLine("123"); } catch { Console.WriteLine(Convert.ToString(task1.Status)); } } } task1.Start(); try { task1.Wait(); Console.WriteLine(Convert.ToString(task1.Status)); } catch { Console.WriteLine(Convert.ToString(task1.Status)); } }
Решение задачи: «Правильно передать tokenSource в функцию с task»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using Data = System.Tuple<System.Threading.CancellationToken, uint,double,object[]>; namespace ConsoleApplication1 { public class Program { static void Main(string[] args) { CancellationTokenSource cancelTokenSource = new CancellationTokenSource(); uint num=1; double time = 10; object[] arr={"t1",0,10}; Task task = Task.Factory.StartNew(o => LinePerform((Data)o), new Data(cancelTokenSource.Token, num, time, arr), cancelTokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); Thread.Sleep(1000); cancelTokenSource.Cancel(); task.Wait(); Console.WriteLine(task.Status); Console.ReadKey(); } public static void LinePerform(Data data) { CancellationToken _token=data.Item1; uint paramsNum=data.Item2; double t=data.Item3; object[] parameters = data.Item4; if (parameters.Length / 3 != paramsNum) { return; } double[] b = new double[paramsNum]; double[] k = new double[paramsNum]; double[] value = new double[paramsNum]; double t1 = 0, t2 = t * 1000; //рассчет коэф. б for (int i = 0; i < paramsNum; i++) { b[i] = Convert.ToDouble(parameters[3 * i + 1]); } //рассчет коэф. к for (int i = 0; i < paramsNum; i++) { k[i] = (Convert.ToDouble(parameters[3 * i + 2]) - b[i]) / t2; } while ((!_token.IsCancellationRequested)&(t1<t2)) { for (t1 = 0; t1 <= t2; t1 = t1 + 200) { for (int i = 0; i < paramsNum; i++) { value[i] = k[i] * t1 + b[i]; Console.WriteLine(Convert.ToString(parameters[3*i])+" "+Convert.ToString(value[i])); } if (t1 < t2) { _token.WaitHandle.WaitOne(200); } } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д