Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程处理xml文件简介_C#_Xml_Multithreading_Locking_Threadpool - Fatal编程技术网

C# 线程处理xml文件简介

C# 线程处理xml文件简介,c#,xml,multithreading,locking,threadpool,C#,Xml,Multithreading,Locking,Threadpool,我以前从未编写过多线程代码(除了一些基本的backgroundworker技巧),我希望获得一些关于如何解决问题的指导 我有一个XML文件,它是一个序列化的列表。对于这些库存项目中的每一个,我都需要执行一个名为UpdatePrice()的Web服务调用 我要做的是获取这些项中的每一项,创建一个线程池(谁的大小取决于我需要处理的行的数量)并开始进行webservice调用 我并不是在要求一个完整的解决方案(显然),但我真的很想得到一些关于如何解决这个问题的指导 我看到出现的最大问题是如何指定哪些线

我以前从未编写过多线程代码(除了一些基本的backgroundworker技巧),我希望获得一些关于如何解决问题的指导

我有一个XML文件,它是一个序列化的
列表
。对于这些库存项目中的每一个,我都需要执行一个名为
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;
});