Правильно передать 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);
                                }
                    }
            }
        }
        }
 
    }

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

12   голосов , оценка 4.083 из 5