2011-03-23 67 views
0

我从来没有写过多线程代码(除了一些基本的backgroundworker技巧),并希望得到一些关于如何处理我的问题的指导。线程简介 - 进程xml文件

我有一个XML文件,这是一个序列化的List<Stock>。对于这些库存项目中的每一个,我都需要执行名为UpdatePrice()的web服务调用。

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

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

我看到的最大问题是我如何指定哪些线程可以在哪些对象上工作。我是否仅仅根据我制作的线程数量和拆分工作来划分它?或者我最好允许每个线程任意选择一个项目从列表中处理? (然后我有锁问题,但作为一个加号可以确保没有线程空闲)

正如我之前所说,我不是在寻找一个完整的解决方案,但只是一些基本的指导,从哪里开始,因为老实说我迷失在这一个并没有写一行代码。

PS:也是在.NET线程安全中自动生成web服务代理?

+0

您使用的是什么版本的.NET? – timothyclifford 2011-03-23 03:10:51

+0

框架4.0上的C# – 2011-03-23 03:11:58

回答

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; 
}); 
+0

谢谢你的这个例子。它看起来非常简单!你能否告诉我们=>运算符的名字是什么(或者什么是正确的术语)?它看起来像某种委托任务,我曾看过它,但想了解更多。 – 2011-03-23 04:01:17

+0

=>是一个lambda表达式,您可以通过该表达式创建匿名函数调用。 http://msdn.microsoft.com/en-us/library/bb397687.aspx – timothyclifford 2011-03-23 04:14:06

+0

谢谢你! – 2011-03-23 06:19:01

1

我想:

  • 首先读取整个XML数据同步。
  • 然后,我会把每个元素处理在一个队列中。然后,你可以产生N个处理线程,在每个处理线程开始时,它会“弹出”你的队列中的一个元素,将这段特定的代码封装在一个互斥体/信号量(谷歌C#互斥体或并发访问或任何相关的)。这很容易在C#中用任意对象上的“锁定”关键字完成。

希望这会有所帮助。 Pierre。

1

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

如果你有一个用户界面,你不想冻结,那么BackgroundWorker的技巧将工作得很好。

+0

不知道我会在那里同意你的看法。如果你有带宽的线程调用到单个Web服务将工作更快,然后单线程的过程。这是诸如免费下载管理器之类的应用程序的原理,不是吗? – 2011-03-23 03:16:12

+0

Web服务的行为不像HTTP或FTP服务器。但问问网站所有者是否可以确保联系。如果他们这样做,是否允许你绕过它。当然你不是。无论如何,他们会引导你。 – 2011-03-23 03:20:21

+0

是的web服务不能像ftp服务器一样工作(虽然web服务是http服务器 - 但这是语义)。关键在于,无论您有web服务,ftp还是http服务,都需要执行特定的工作量。通常,http请求中的限制不是带宽,而是ping时间。因此,如果您能够将这项工作分解为多个并发呼叫,结果将是正面的。话虽如此,但他们可能会阻止特定用户的IP或呼叫是有效的。我必须找出答案。 – 2011-03-23 03:49:45