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()