有decimal一个参数。假设它等于 10。有Task一段时间100ms将它减少0.1. 一旦参数变得等于1,任务应该结束并且参数不应该再减少。如果Task只有一个,则可以正常工作。但如果它们是2, 3, 100...,那么参数最终会变小1。我尝试使用CancellationToken来完成所有任务,但结果还是一样。我的代码:
class Program
{
static decimal param = 108;
static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
static CancellationToken token;
static void Main(string[] args)
{
int tasksCount = 16;
token = cancelTokenSource.Token;
Console.WriteLine("Start Param = {0}", param);
Console.WriteLine("Tasks Count = {0}", tasksCount);
var tasksList = new List<Task>();
for (var i = 0; i < tasksCount; i++)
{
Task task = new Task(Decrementation, token);
tasksList.Add(task);
}
tasksList.ForEach(x => x.Start());
Task.WaitAny(tasksList.ToArray());
Console.WriteLine("Result = {0}", param);
Console.Read();
}
private static void Decrementation()
{
while (true)
{
if (token.IsCancellationRequested)
{
break;
}
if (CanTakeMore())
{
Task.Delay(100);
param = param - 0.1m;
}
else
{
cancelTokenSource.Cancel();
return;
}
}
}
private static bool CanTakeMore()
{
if (param > 1)
{
return true;
}
else
{
return false;
}
}
}
输出不同,但始终小于 1。
我究竟做错了什么?









