Правильно передать tokenSource в функцию с task - C#

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

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

Как передать правильно tokenSource в функцию? Сделать обертку с функцией где аргумент будет tokenSource и ее передавать в конструктор task? Или возможно что то типа этого: ( на данном этапе cancel не отрабатывает)
Листинг программы
  1. public class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
  6. func(cancelTokenSource);
  7. cancelTokenSource.Cancel();
  8. Console.ReadKey();
  9. }
  10.  
  11. static void func(CancellationTokenSource cancelTokenSource)
  12. {
  13. CancellationToken _token = cancelTokenSource.Token;
  14. int number = 6;
  15. Task task1 = new Task(() =>
  16. {
  17. int result = 1;
  18. for (int i = 1; i <= number; i++)
  19. {
  20. if (_token.IsCancellationRequested)
  21. {
  22. _token.ThrowIfCancellationRequested();
  23. }
  24. result *= i;
  25. Thread.Sleep(2000);
  26. //cancelTokenSource.Cancel();
  27. }
  28. }, cancelTokenSource.Token);
  29. task1.Start();
  30. try
  31. {
  32. task1.Wait();
  33. Console.WriteLine(Convert.ToString(task1.Status));
  34. Console.WriteLine("123");
  35. }
  36. catch
  37. {
  38. Console.WriteLine(Convert.ToString(task1.Status));
  39. }
  40. }
  41. }
  42. task1.Start();
  43. try
  44. {
  45. task1.Wait();
  46. Console.WriteLine(Convert.ToString(task1.Status));
  47. }
  48. catch
  49. {
  50. Console.WriteLine(Convert.ToString(task1.Status));
  51. }
  52. }

Решение задачи: «Правильно передать tokenSource в функцию с task»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Threading;
  7. using Data = System.Tuple<System.Threading.CancellationToken, uint,double,object[]>;
  8.  
  9. namespace ConsoleApplication1
  10. {
  11.     public class Program
  12.     {
  13.  
  14.        
  15.         static void Main(string[] args)
  16.         {
  17.             CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
  18.            
  19.             uint num=1;
  20.             double time = 10;
  21.             object[] arr={"t1",0,10};
  22.             Task task = Task.Factory.StartNew(o => LinePerform((Data)o), new Data(cancelTokenSource.Token, num, time, arr),
  23.             cancelTokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
  24.             Thread.Sleep(1000);
  25.             cancelTokenSource.Cancel();
  26.             task.Wait();
  27.             Console.WriteLine(task.Status);
  28.             Console.ReadKey();
  29.         }
  30.  
  31.         public static void LinePerform(Data data)
  32.         {
  33.             CancellationToken _token=data.Item1;
  34.             uint paramsNum=data.Item2;
  35.             double t=data.Item3;
  36.             object[] parameters = data.Item4;
  37.             if (parameters.Length / 3 != paramsNum)
  38.             {
  39.                 return;
  40.             }
  41.             double[] b = new double[paramsNum];
  42.             double[] k = new double[paramsNum];
  43.             double[] value = new double[paramsNum];
  44.             double t1 = 0, t2 = t * 1000;
  45.             //рассчет коэф. б
  46.             for (int i = 0; i < paramsNum; i++)
  47.             {
  48.                 b[i] = Convert.ToDouble(parameters[3 * i + 1]);
  49.             }
  50.             //рассчет коэф. к
  51.             for (int i = 0; i < paramsNum; i++)
  52.             {
  53.                 k[i] = (Convert.ToDouble(parameters[3 * i + 2]) - b[i]) / t2;
  54.             }
  55.             while ((!_token.IsCancellationRequested)&(t1<t2))
  56.             {
  57.                     for (t1 = 0; t1 <= t2; t1 = t1 + 200)
  58.                     {
  59.                                 for (int i = 0; i < paramsNum; i++)
  60.                                 {
  61.                                     value[i] = k[i] * t1 + b[i];
  62.                                     Console.WriteLine(Convert.ToString(parameters[3*i])+" "+Convert.ToString(value[i]));
  63.                                 }
  64.                                 if (t1 < t2)
  65.                                 {
  66.                                     _token.WaitHandle.WaitOne(200);
  67.                                 }
  68.                     }
  69.             }
  70.         }
  71.         }
  72.  
  73.     }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут