var typeToFunc = new Dictionary<Type, AddFunc>() {{typeof(int), IntAdd}, {typeof(Vector2), Vector2Add}};
var left = 123;
var right = 14455;
var result = Add(left, right);
Console.WriteLine($"Результат сложения {left} и {right} = {result}");
var leftVector = new Vector2(123, 55);
var rightVector = new Vector2(55, 111);
var resultVector = Add(leftVector, rightVector);
Console.WriteLine($"Результат сложения {leftVector} и {rightVector} = {resultVector}");
T Add<T>(T left, T right)
{
return ( T ) typeToFunc[typeof(T)](left, right);
}
object Vector2Add(object left, object right)
{
return ( Vector2 ) left + ( Vector2 ) right;
}
object IntAdd(object left, object right)
{
return (int) left + (int) right;
}
delegate object AddFunc(object left, object right);
var number = NumberOrVector2<int>.FromNumber(123);
var newNumber = number.Add(() => 23, () => throw new InvalidOperationException("хранится число"));
if (newNumber.TryGetNumber(out var result))
{
Console.WriteLine($"Получился результат: {result}");
}
else
{
Console.WriteLine($"Ошибка - хранился вектор");
}
public readonly struct NumberOrVector2<TNumber> where TNumber: unmanaged, INumber<TNumber>
{
private readonly TNumber _number;
private readonly Vector2? _vector;
private NumberOrVector2(TNumber number, Vector2? vector)
{
_number = number;
_vector = vector;
}
public bool TryGetNumber(out TNumber number)
{
number = _number;
return !_vector.HasValue;
}
public bool TryGetVector(out Vector2 vector)
{
vector = _vector.GetValueOrDefault();
return _vector.HasValue;
}
public NumberOrVector2<TNumber> Add(Func<TNumber> numberAdd, Func<Vector2> vectorAdd)
{
if (_vector is {} vector)
{
return new NumberOrVector2<TNumber>(_number, vector + vectorAdd());
}
return new NumberOrVector2<TNumber>(_number + numberAdd(), null);
}
public static NumberOrVector2<TNumber> FromNumber(TNumber number)
{
return new NumberOrVector2<TNumber>(number, null);
}
public static NumberOrVector2<TNumber> FromVector(Vector2 vector)
{
return new NumberOrVector2<TNumber>(default, vector);
}
}
CancellationToken token = cancelTokenSource.Token;
///...
Task task2 = new Task(() =>
{
for (int i = 1; i < 10; i++)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Операция прервана");
return;
}
Console.WriteLine($"2. Квадрат числа {i} равен {i * i}");
Thread.Sleep(200);
}
});
.. они у тебя в одной области видимости, и ты бодро проверяешь статус завершения.. зачем? ;)))using System.Threading.Tasks;
using System.Threading;
using System;
class cancelTokenTest
{
static void Main(string[] args)
{
var cancelTokenSource = new CancellationTokenSource();
var token = cancelTokenSource.Token;
var cancelTokenSource2 = new CancellationTokenSource();
var token2 = cancelTokenSource2.Token;
var task = new Task(() =>
{
for (int i = 1; i < 100000; i++)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Операция 1 прервана");
return;
}
Console.WriteLine($"1. Квадрат числа {i} равен {i * i}");
Thread.Sleep(200);
}
}, token);
var task2 = new Task(() =>
{
for (int i = 10; i < 1000000; i++)
{
if (token2.IsCancellationRequested)
{
Console.WriteLine("Операция 2 прервана");
return;
}
Console.WriteLine($"2. Квадрат числа {i} равен {i * i}");
Thread.Sleep(200);
}
}, token2);
task.Start();
task2.Start();
Thread.Sleep(1000);
cancelTokenSource.Cancel();
Thread.Sleep(50); // без этого не успевает обновиться статус у меня..
Console.WriteLine($"Task Status 1: {task.Status}");
Thread.Sleep(1000);
cancelTokenSource2.Cancel();
Thread.Sleep(200); // можете закаментить для сравнения, и поиграть со значениями..
Console.WriteLine($"Task Status 2: {task2.Status}");
cancelTokenSource.Dispose();
cancelTokenSource2.Dispose();
}
}
using System.Runtime.CompilerServices;
public static class cancelTokenTest8and2task
{
public static void print(this string s) => Console.WriteLine(s);
public static void Main()
{
var ts1 = new CancellationTokenSource();
var tk1 = ts1.Token;
var ts2 = new CancellationTokenSource();
var tk2 = ts2.Token;
var t1 = new Task(() => {
for (int i = 1; i < 100000; i++)
{
if (tk1.IsCancellationRequested)
{
"Операция t1 прервана".print();
return;
}
$"t1. Квадрат числа {i} равен {i * i}".print();
Thread.Sleep(200);
}
});
var t2 = new Task(() => {
for (int i = 1; i < 100000; i++)
{
if (tk2.IsCancellationRequested)
{
"Операция t2 прервана".print();
return;
}
$"t2. Корень числа {i} равен {Math.Sqrt(i)}".print();
Thread.Sleep(200);
}
});
t1.Start();
t2.Start();
Thread.Sleep(1000);
ts1.Cancel();
Thread.Sleep(50);
$"\nTask1 status: {t1.Status}".print();
Thread.Sleep(1000);
ts2.Cancel();
Thread.Sleep(200);
$"\nTask2 status: {t2.Status}".print();
ts1.Dispose();
ts2.Dispose();
}
}
работает в дот нет 8 ... кроме using System.Runtime.CompilerServices;
я разницы пока не вижу (имена не в счет!)...simpleDividers(n)[len(simpleDividers(n))+1]