C# 实现多线程以在线程中执行for循环

C# 实现多线程以在线程中执行for循环,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我有一个包含65000个字符串的字符串类型列表。我需要遍历所有这些字符串并执行一些任务。运行for循环迭代65000次需要更多的时间。所以我想启动4到5个线程,它们可以分割这个列表数据,并分别执行10000到15000个数据。我已经了解了如何使用thread类启动和中止线程。但我不清楚多线程和线程管理以及如何实现锁定机制,这样多个线程就不能在同一数据上工作,执行顺序也不会改变 我不熟悉线程概念。请帮助。任何代码示例都将不胜感激。 谢谢。我建议先试用PLinq并行Linq: myList

我有一个包含65000个字符串的字符串类型列表。我需要遍历所有这些字符串并执行一些任务。运行for循环迭代65000次需要更多的时间。所以我想启动4到5个线程,它们可以分割这个列表数据,并分别执行10000到15000个数据。我已经了解了如何使用thread类启动和中止线程。但我不清楚多线程和线程管理以及如何实现锁定机制,这样多个线程就不能在同一数据上工作,执行顺序也不会改变

我不熟悉线程概念。请帮助。任何代码示例都将不胜感激。 谢谢。

我建议先试用PLinq并行Linq:

  myList
    .AsParallel()
    .WithDegreeOfParallelism(4)
    .ForAll(item => MyRoutine(item));
另一个选项是Parallel.ForEach:

编辑:要小心,许多类都不是线程安全的,包含的列表请参见下面的注释。如果要将数据具体化到列表中,请使用PLinq:


不要用线!改用Task,让框架处理线程池上任务的处理方式。另外,如果您只是从列表中读取,那么您不需要锁定。为什么不使用.NET的Parallel.For或PLINQ呢?为什么要编写自己的?是的,并行。For更适合这种情况。@EpicSam:嗨,如果使用队列而不是列表,是否需要锁定?嗨,我已经厌倦了你的第一个代码。但它并没有执行所有65000条记录,只给出了大约64790条记录,有什么线索吗?@Naveen kumar:你有抛出异常吗?没有抛出异常。代码正在执行,但结果不是accurate@Naveen库马尔:你执行什么代码?它可能不是线程安全的,例如死锁或竞争条件。var listStrings=new List;//此列表将有65000个字符串var data=新列表;PARALLEOPTIONS op=新的PARALLEOPTIONS{MAXDEGEEOFPARALLELISM=4,};Parallel.ForEachlistStrings,op,item=>data.Additem.text.Substring5,item.text.Length=====这是我的代码,它给出了错误的输出,我的数据列表在完成后没有65000个字符串
  ParallelOptions op = new ParallelOptions() {
    MaxDegreeOfParallelism = 4,
  };

  Parallel.ForEach(myList, op, item => MyRoutine(item));
  List<string> listStrings = myList
    .AsParallel()
    .WithDegreeOfParallelism(4)
    .Select(item => item.text.Substring(5, item.text.Length)))
    .ToList(); // <- this is thread safe