Multithreading 处理数据列表的多线程

Multithreading 处理数据列表的多线程,multithreading,.net-2.0,Multithreading,.net 2.0,我有一个300000多个项目的列表。 我目前正在对列表执行的操作是验证地址,并将原始地址和更正的地址写入指定的文件。 我想做的是在给定数量的线程之间平均分割列表,并在这些线程上同时执行进程。 有谁能帮我举一个例子,告诉我如何做这样的事情 感谢从概念上讲,考虑到两个假设,它相当简单: 您在运行期间不会更改列表 处理 您提前知道线程的数量 基本上,您的算法是: 根据线程的数量将列表分成大部分偶数部分 为每个线程提供其节的开始和结束索引以及输出文件 在每个线程中: A.处理项目 B锁定对输出文件的

我有一个300000多个项目的列表。 我目前正在对列表执行的操作是验证地址,并将原始地址和更正的地址写入指定的文件。 我想做的是在给定数量的线程之间平均分割列表,并在这些线程上同时执行进程。 有谁能帮我举一个例子,告诉我如何做这样的事情


感谢

从概念上讲,考虑到两个假设,它相当简单:

  • 您在运行期间不会更改列表 处理
  • 您提前知道线程的数量
基本上,您的算法是:

  • 根据线程的数量将列表分成大部分偶数部分
  • 为每个线程提供其节的开始和结束索引以及输出文件
  • 在每个线程中:
    A.处理项目
    B锁定对输出文件的访问
    C写下原始和更正的地址
    D解锁对输出文件的访问

  • 如果您使用的是2.0,并且列表仅以只读方式使用(在处理过程中不会更改),那么您可以简单地划分索引。例如

    public void Process(List<Item> list, int threadCount) {
      int perThread = list.Count < threadCount ? list.Count : list.Count / threadCount;
      int index = 0;
      while ( index < list.Count ) {
         int start = index;
         int count = Math.Min(perThread,list.Count-start);
         WaitCallBack del = delegate(object state) { ProcessCore(list, start, count); };
         ThreadPool.QueueUserWorkItem(del);
         index += count;
      }
    }
    
    private void ProcessCore(List<Item> list, int startIndex, int count) {
      // Do work here
    }
    
    public void进程(列表、int threadCount){
    int perThread=list.Count
    是否只有一个输出文件?是的,最终会有一个输出文件。如果只有一个输出文件,则需要包含文件锁定(我可能会将一个StreamWriter传递给线程函数,尽管可能有更好的方法)。