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