Правильно передать 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);
- }
- }
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д