【发布时间】:2014-08-30 10:40:57
【问题描述】:
我有一个循环遍历应用列表的程序。
Apps
--------
App1
App2
App3
现在,对于它们中的每一个,我都会发出一个 http 请求,以将每个应用的构建列表作为 Xml 获取。
这样的请求,
http://example.com/getapplist.do?appid=App1
给我这样的回应,
<appid name="App1">
<buildid BldName="Bld3" Status="Not Ready"></buildid>
<buildid BldName="Bld2" Status="Ready"></buildid>
<buildid BldName="Bld1" Status="Ready"></buildid>
</appid>
现在我得到 最高内部版本号,状态为“就绪”,然后执行另一个 Web api 调用,例如,
http://example.com/getapplist.do?appid=App1&bldid=Bld2
这给了我这样的回应,
<buildinfo appid="App1" buildid="Bld2" value="someinfo"></build>
我将这些输入到内部数据表中。但是现在,这个程序需要很长时间才能完成(3 小时),因为我有接近 2000 个 appid,每个 id 有 2 个 Web 请求。我尝试使用指定here 的BackgroundWorker 对该问题进行排序。我想将来自 http 响应的所有信息整理成一个 XML,然后使用该 XML 进行进一步处理。这会引发错误,
文件正被另一个进程使用
所以我的代码看起来像,
if (!backgroundWorker1.IsBusy)
{
for(int i = 0; i < appList.Count; i++)
{
BackgroundWorker bgw = new BackgroundWorker();
bgw.WorkerReportsProgress = true;
bgw.WorkerSupportsCancellation = true;
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
//Start The Worker
bgw.RunWorkerAsync();
}
}
DoWork 函数选择标记值并将其放入 XML。
我可以从所有后台工作人员的所有 http 响应中将 app-buildinfo 详细信息放入一个公共文件中的最佳方法是什么?
【问题讨论】:
-
这会生成 2000 个后台工作人员...不好...而是从一个后台工作人员调用您的 webapi 异步...并在异步 webrequest 完成事件之一触发并写入 xml 文件时使用锁定.
-
能否请您添加您的
DoWork方法代码? -
@rene ,那么我必须设置的限制是多少?另外,如果我设置了 5 个后台工作人员的限制,这是否意味着线程将并行运行,直到处理完所有 2K url?
-
@YuvalItzchakov 。目前,在我的 DoWork 中,我有一些代码可以从我得到的 XML 响应中构建一个字符串,然后执行一个简单的 System.IO.File.WriteAllText(filename,stringvalue)
-
试试Parallel.For 或Parallel.ForEach 更简单,不用担心线程太多会导致性能下降。
标签: c# xml multithreading http .net-4.0