Почему я получить другой результат со следующими секциями кодыThreadLocal Скопление и Task Parallel Library
Пример кода 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ThreadLocalTasks
{
class Program
{
static void Main(string[] args)
{
ThreadLocal<int> aggregrations = new ThreadLocal<int>();
Task<int>[] tasks = new Task<int>[10];
for (int i = 0; i < tasks.Length; i++)
{
aggregrations.Value = 0;
int tempi = i;
tasks[tempi] = new Task<int>(() =>
{
int temp = 0;
for (int j = 1; j <= 3; j++)
{
temp += j;
}
aggregrations.Value = temp;
return aggregrations.Value;
});
}
tasks.ToList().ForEach(x => {
x.Start();
});
Task.WaitAll(tasks);
int sum = 0;
tasks.ToList().ForEach(x =>
{
sum += x.Result;
});
Console.WriteLine("Sum: {0}", sum);
Console.WriteLine("Press any key to quit..");
Console.ReadKey();
}
}
}
Пример 2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ThreadLocalTasks
{
class Program
{
static void Main(string[] args)
{
ThreadLocal<int> aggregrations = new ThreadLocal<int>();
Task<int>[] tasks = new Task<int>[10];
for (int i = 0; i < tasks.Length; i++)
{
aggregrations.Value = 0;
int tempi = i;
tasks[tempi] = new Task<int>(() =>
{
for (int j = 1; j <= 3; j++)
{
aggregrations.Value += j;
}
return aggregrations.Value;
});
}
tasks.ToList().ForEach(x => {
x.Start();
});
Task.WaitAll(tasks);
int sum = 0;
tasks.ToList().ForEach(x =>
{
sum += x.Result;
});
Console.WriteLine("Sum: {0}", sum);
Console.WriteLine("Press any key to quit..");
Console.ReadKey();
}
}
}
Речь идет не столько о том, зачем вам это делать, но и об этом техническом правиле. – Blair
Я добавил более подробное объяснение, почему оба примера являются «неправильными». –