我之前从未编写过多线程代码(除了一些基本的背景工作技巧),我希望得到一些关于如何解决问题的指导。
我有一个XML文件,它是序列化的List<Stock>
。对于这些库存商品中的每一个,我需要执行名为UpdatePrice()
的网络服务电话。
我想要做的是获取这些项目中的每一项,创建一个线程池(谁的大小取决于我需要处理的行数)并开始进行webservice调用。
我不是要求一个完整的解决方案(显然),但我真的很感激一些关于如何解决这个问题的指导。
我看到的最大问题是如何指定哪些线程可以在哪些对象上运行。我只是把列表除以我制作的线程数并拆分工作吗?或者我最好允许每个线程从列表中任意选择一个项目来处理? (然后我有锁定问题但是加号可以确保没有线程空闲)
正如我之前所说的,我不是在寻找一个完整的解决方案,而只是一些关于从何处开始的基本指导,因为老实说,我在这个问题上迷失了,并且没有编写任何一行代码。
PS:也是.NET threadsafe中自动生成的webservice代理吗?
答案 0 :(得分:1)
我会:
希望这会有所帮助。 皮尔。
答案 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;
});