gpt4 book ai didi

c# - 使用多个 http 请求-响应

转载 作者:数据小太阳 更新时间:2023-10-29 02:26:27 25 4
gpt4 key购买 nike

我有一个循环遍历应用列表的程序。

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 请求。我尝试使用指定的 BackgroundWorker 对这个问题进行排序 here .我想将来自 http 响应的所有信息整理成一个 XML,然后使用该 XML 进行进一步处理。这会引发错误,

file being used by another process

所以我的代码看起来像,

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 响应中获取应用程序构建信息详细信息到一个公共(public)文件的最佳方法是什么?

最佳答案

HTTP 请求本质上是 IO 绑定(bind)和异步的,没有理由使用后台 worker 来完成您的需要。

您可以利用 async-await,它通过 Microsoft.Bcl.Async 在 .NET 4 中兼容。和 HttpClient :

private async Task ProcessAppsAsync(List<string> appList)
{
var httpClient = new HttpClient();

// This will execute your IO requests concurrently,
// no need for extra threads.
var appListTasks = appList.Select(app => httpClient.GetAsync(app.Url)).ToList();

// Wait asynchronously for all of them to finish
await Task.WhenAll(appListTasks);

// process each Task.Result and aggregate them to an xml
using (var streamWriter = new StreamWriter(@"PathToFile")
{
foreach (var appList in appListTasks)
{
await streamWriter.WriteAsync(appList.Result);
}
}
}

这样,您可以同时处理所有请求,并在所有请求完成后处理所有请求的结果。

关于c# - 使用多个 http 请求-响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25581469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com