2009-11-05 78 views
1

我有一个300,000 +项目的列表。 我目前对列表做的事情是验证地址并将原始地址和更正后的地址写入指定的文件。 我想要做的是平均分配给定数量的线程之间的列表并同时做他们的进程。 任何人都可以帮助我举一个例子,说明我可以如何去做这样的事情?多线程处理列表数据

感谢

+0

是否只有一个输出文件? – 2009-11-05 16:48:09

+0

是的,会有一个最终的输出文件。 – AlteredConcept 2009-11-05 22:30:58

回答

1

如果你在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 
} 
+0

如果只有一个输出文件,则需要包含文件锁定(我可能会将一个StreamWriter传递给线程函数,尽管可能有更好的方法)。 – 2009-11-05 16:50:50

1

从概念上讲,这是相当简单的,有几假设:

  • 你不 处理过程中改变列表。
  • 你知道提前线程的数量。

基本上,你的算法是这样的:

  1. 斯普利特列表分为基于线程的数量大多,甚至部分。
  2. 为每个线程分配其节的开始和结束索引以及输出文件。
  3. 在每个线程中:
    a。处理项目
    b。锁定对输出文件的访问
    c。写出原始和更正的地址
    d。解锁访问输出文件