我有一个程序,它会循环遍历应用程序列表。
现在,我需要为每个应用做一个HTTP请求,以获取每个应用程序构建列表的XML格式数据。
例如,以下是一个请求示例:
现在我通过状态为“就绪”的高版本号来获取最高构建号,然后执行另一个 Web API 调用,如下所示:
这让我得到了一个响应,类似于:
我将这些数据输入内部数据表中。但是,由于我有接近2000个appids,每个id都需要进行2次Web请求,所以现在这个程序需要非常长的时间才能完成(3小时)。为了解决这个问题,我尝试使用一个BackgroundWorker,如此处所述。我考虑将所有来自http响应的信息汇总到单个XML中,然后使用该XML进行进一步处理。但这会引发以下错误:
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>
我将这些数据输入内部数据表中。但是,由于我有接近2000个appids,每个id都需要进行2次Web请求,所以现在这个程序需要非常长的时间才能完成(3小时)。为了解决这个问题,我尝试使用一个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详细信息,并将其放入一个公共文件中?
DoWork
方法代码? - Yuval ItzchakovParallel.ForEach
。 - Yuval Itzchakov