C# 使用Task.Run()将一个大循环拆分为几个小循环

C# 使用Task.Run()将一个大循环拆分为几个小循环,c#,threadpool,multitasking,C#,Threadpool,Multitasking,我有一个大回路 我想把这个过程分成几个较小的循环 因此,我使用以下代码: class Program { static void Main(string[] args) { List<string> input = new List<string>(); for (int i = 0; i < 100; i++) { input.Add(i.ToString());

我有一个大回路

我想把这个过程分成几个较小的循环

因此,我使用以下代码:

class Program
{
    static void Main(string[] args)
    {
        List<string> input = new List<string>();

        for (int i = 0; i < 100; i++)
        {
            input.Add(i.ToString());
        }

        int take = 2;
        List<Task<string>> tasks = new List<Task<string>>();

        for (int i = 0; i < 10; i++)
        {
            // Launch of the tasks
            tasks.Add(Task.Run<string>(() => Process(input.Skip(i * take).Take(take).ToList())));
        }

        Task<string[]> resultTask = Task.WhenAll<string>(tasks.ToArray());

        resultTask.Wait();

        if (resultTask.Status == TaskStatus.RanToCompletion)
        {
            foreach (var currentText in resultTask.Result)
            {
                Console.WriteLine(currentText);
            }
        }

        Console.ReadKey();
    }

    static int number = 0;

    private static string Process(List<string> inputList)
    {
        foreach (var item in inputList)
        {
            // The process here for each small loops.
            Console.WriteLine(item);
        }

        return "Thread " + number++;
    }
}
被执行

我试图克隆列表,但得到了相同的结果

为什么?

编辑: 列表如下所示:

0123456789

101112131415171819

20 21 22 23 24 25 26 28 29

30 31 32 33 34 35 36 38 39


90919293949596979899

我们谈论的名单有多大?列表和线程是一个头疼的问题。我想从很多点(SqlGeography)构建一个SqlGeography(LineString)对象。大约100000次迭代/点,可能更多。也许列表不应该拆分列表,而是应该包含包装基本类型的对象,然后在工作队列或线程中处理每个迭代。此外,使用字符串数据类型可能会根据数据的实际情况来减慢,考虑使用已经为您的需要格式化的数据创建结构或类对象,然后将该对象放在列表中。此属性的类型为SqlGeography,它是我的基本类型。在上面的示例中,我使用类型字符串使其更简单。好的,那么是的,我建议为列表创建或使用异步安全包装器,然后迭代列表一次,但在工作队列中执行任务
input.Skip(i * take).Take(take).ToList()