C# 线程处理xml文件简介
我以前从未编写过多线程代码(除了一些基本的backgroundworker技巧),我希望获得一些关于如何解决问题的指导 我有一个XML文件,它是一个序列化的C# 线程处理xml文件简介,c#,xml,multithreading,locking,threadpool,C#,Xml,Multithreading,Locking,Threadpool,我以前从未编写过多线程代码(除了一些基本的backgroundworker技巧),我希望获得一些关于如何解决问题的指导 我有一个XML文件,它是一个序列化的列表。对于这些库存项目中的每一个,我都需要执行一个名为UpdatePrice()的Web服务调用 我要做的是获取这些项中的每一项,创建一个线程池(谁的大小取决于我需要处理的行的数量)并开始进行webservice调用 我并不是在要求一个完整的解决方案(显然),但我真的很想得到一些关于如何解决这个问题的指导 我看到出现的最大问题是如何指定哪些线
列表
。对于这些库存项目中的每一个,我都需要执行一个名为UpdatePrice()
的Web服务调用
我要做的是获取这些项中的每一项,创建一个线程池(谁的大小取决于我需要处理的行的数量)并开始进行webservice调用
我并不是在要求一个完整的解决方案(显然),但我真的很想得到一些关于如何解决这个问题的指导
我看到出现的最大问题是如何指定哪些线程将在哪些对象上工作。我是否简单地将列表除以我制作的线程数,然后分割工作?还是让每个线程从列表中任意选取一项进行处理更好?(这样我就有了锁定问题,但作为一个加号,可以确保没有线程处于空闲状态)
正如我之前所说的,我不是在寻找一个完整的解决方案,而是在哪里开始寻找一些基本的指导,因为老实说,我对这一点很迷茫,而且还没有编写一行代码
PS:在.NET threadsafe中也有自动生成的webservice代理吗?我想:
- 首先同步读取整个XML数据
- 然后,我将把要处理的每个元素放在一个队列中
- 然后,您可以生成N个处理线程,在每个线程的开头,它会“弹出”队列中的一个元素,将这段特定代码包装在互斥/信号量(Google C#mutex,或并发访问,或任何相关内容)中。这在C#中很容易做到,在任意对象上使用“lock”关键字
- 首先同步读取整个XML数据
- 然后,我将把要处理的每个元素放在一个队列中
- 然后,您可以生成N个处理线程,在每个线程的开头,它会“弹出”队列中的一个元素,将这段特定代码包装在互斥/信号量(Google C#mutex,或并发访问,或任何相关内容)中。这在C#中很容易做到,在任意对象上使用“lock”关键字
Pierre.在这里使用线程没有意义。一个线程只能给你一种资源:更多的cpu周期,前提是你有一个多核的cpu。这不是加速程序所需的资源。你需要更快的互联网连接
如果您有一个不想冻结的UI,那么BackgroundWorker的技巧就可以正常工作。在这里使用线程没有任何意义。一个线程只能给你一种资源:更多的cpu周期,前提是你有一个多核的cpu。这不是加速程序所需的资源。你需要更快的互联网连接
如果你有一个不想冻结的UI,那么BackgroundWorker的技巧就可以很好地发挥作用。我建议你研究和PLINQ以寻求解决方案。使用
Parallel.ForEach()
的简单示例解决方案可能如下所示(示例中并行调用限制为5次)
上市;
平行。ForEach(股票,
新的ParallelOptions(){MaxDegreeOfParallelism=5},
(股票)=>
{
float newPrice=UpdatePrice(stock.TickerSymbol);//web服务调用
股票价格=新价格;
});
我建议您研究和PLINQ以寻求解决方案。使用Parallel.ForEach()
的简单示例解决方案可能如下所示(示例中并行调用限制为5次)
上市;
平行。ForEach(股票,
新的ParallelOptions(){MaxDegreeOfParallelism=5},
(股票)=>
{
float newPrice=UpdatePrice(stock.TickerSymbol);//web服务调用
股票价格=新价格;
});
你使用的是什么版本的.NET?你使用的是什么版本的.NET?我不知道我会同意你的看法。如果您拥有带宽,那么对单个Web服务的线程调用将比单线程进程工作得更快。这是免费下载管理器等应用程序背后的原理,不是吗?web服务的行为不像http或ftp服务器。但是,请询问网站所有者,他们是否限制了连接以确保。如果他们这样做了,你是否可以绕过它。你肯定不是。是的,Web服务不像ftp服务器那样工作(虽然Web服务是http服务器,但这是语义)。关键的一点是,无论您使用的是webservice、ftp还是http服务,您都需要执行特定数量的工作。通常,http请求中的限制不是带宽,而是ping时间。因此,如果您能够将此工作分解为多个并发调用,结果将是积极的。话虽如此,他们可能会限制ip或特定用户的呼叫,这一点是正确的。我得弄清楚。我不知道我会同意你的看法。如果您拥有带宽,那么对单个Web服务的线程调用将比单线程进程工作得更快。这是免费下载管理器等应用程序背后的原理,不是吗?web服务的行为不像http或ftp服务器。但是,请询问网站所有者,他们是否限制了连接以确保。如果他们这样做了,你是否可以绕过它。你肯定不是。是的,Web服务不像ftp服务器那样工作(虽然Web服务是http服务器,但这是语义)。关键的一点是,无论您使用的是webservice、ftp还是http服务,您都需要执行特定数量的工作。通常,http请求中的限制不是带宽,而是ping时间。因此,如果您能够将此工作分解为多个并发调用
List<Stock> stocks;
Parallel.ForEach(stocks,
new ParallelOptions() { MaxDegreeOfParallelism = 5 },
(stock) =>
{
float newPrice = UpdatePrice(stock.TickerSymbol); //web service call
stock.Price = newPrice;
});