线程简介 - 处理xml文件

时间:2011-03-23 03:07:58

标签: c# xml multithreading locking threadpool

我之前从未编写过多线程代码(除了一些基本的背景工作技巧),我希望得到一些关于如何解决问题的指导。

我有一个XML文件,它是序列化的List<Stock>。对于这些库存商品中的每一个,我需要执行名为UpdatePrice()的网络服务电话。

我想要做的是获取这些项目中的每一项,创建一个线程池(谁的大小取决于我需要处理的行数)并开始进行webservice调用。

我不是要求一个完整的解决方案(显然),但我真的很感激一些关于如何解决这个问题的指导。

我看到的最大问题是如何指定哪些线程可以在哪些对象上运行。我只是把列表除以我制作的线程数并拆分工作吗?或者我最好允许每个线程从列表中任意选择一个项目来处理? (然后我有锁定问题但是加号可以确保没有线程空闲)

正如我之前所说的,我不是在寻找一个完整的解决方案,而只是一些关于从何处开始的基本指导,因为老实说,我在这个问题上迷失了,并且没有编写任何一行代码。

PS:也是.NET threadsafe中自动生成的webservice代理吗?

3 个答案:

答案 0 :(得分:1)

我会:

  • 首先同步读取整个XML数据。
  • 然后,我会将每个要处理的元素放在一个队列中。
  • 然后,您可以生成N个处理线程,在每个处理线程的开头,它会“弹出”您队列的一个元素,将这段特定代码包装在互斥锁/信号量中(Google C#互斥锁,或并发)访问,或任何相关的)。这可以在C#中使用任意对象上的“lock”关键字轻松完成。

希望这会有所帮助。 皮尔。

答案 1 :(得分:1)

在这里使用线程毫无意义。一个线程只能给你一个资源:更多的cpu周期,前提是你有一个具有多个内核的CPU。这不是加速程序所需的资源。您需要更快的Internet连接。

如果您有一个不需要冻结的UI,那么BackgroundWorker技巧就可以了。

答案 2 :(得分:1)

我建议调查TPL和PLINQ寻求解决方案。使用Parallel.ForEach()的简单示例解决方案可能如下所示(示例中并行调用限制为5)。

List<Stock> stocks;
Parallel.ForEach(stocks, 
                 new ParallelOptions() { MaxDegreeOfParallelism = 5 }, 
                 (stock) =>
{
    float newPrice = UpdatePrice(stock.TickerSymbol); //web service call
    stock.Price = newPrice;
});