C# Windows Phone,多个HTTP请求并行,有多少个?
在我的Windows Phone 8应用程序中,我正在从web api获取项目列表。之后,我循环所有项目并获取每个项目的详细信息 现在我的代码是这样的:C# Windows Phone,多个HTTP请求并行,有多少个?,c#,windows-phone-8,async-await,dotnet-httpclient,C#,Windows Phone 8,Async Await,Dotnet Httpclient,在我的Windows Phone 8应用程序中,我正在从web api获取项目列表。之后,我循环所有项目并获取每个项目的详细信息 现在我的代码是这样的: List planes=wait planeService.getPlanes();//从web api获取所有平面 foreach(平面中的平面) { var details=await planeService.getDetails(plane.id);//从web api获取一个平面的详细信息 图纸详图(详图); } 我如何改进这一点,
List planes=wait planeService.getPlanes();//从web api获取所有平面
foreach(平面中的平面)
{
var details=await planeService.getDetails(plane.id);//从web api获取一个平面的详细信息
图纸详图(详图);
}
我如何改进这一点,使多个请求并行运行,并行运行的请求的合理数量是多少?“平面”列表可以是0到100个对象中的任何对象,通常最多20个。您应该检查,这将为HTTP连接提供连接管理。ServicePoint对象允许的默认最大并发连接数为2。因此,如果你需要增加它,你可以使用。只需查看MSDN中的链接,就可以看到一个示例。并设置所需的值。这可能对你有帮助
如何改进此功能以并行发出多个请求
您可以像下面这样执行并行处理(未测试)。它使用SemaphoreSlim
限制getDetails
请求
async Task ProcessPlanes()
{
const int MAX_REQUESTS = 50;
List<plane> planes = await planeService.getPlanes(); // Get all planes from web api
var semaphore = new SemaphoreSlim(MAX_REQUESTS);
Func<string, Task<Details>> getDetailsAsync = async (id) =>
{
await semaphore.WaitAsync();
try
{
var details = await planeService.getDetails(id);
drawDetails(details);
return details;
}
finally
{
semaphore.Release();
}
};
var tasks = planes.Select((plane) =>
getDetailsAsync(plane.id));
await Task.WhenAll(tasks.ToArray());
}
异步任务处理平面()
{
const int MAX_请求=50;
List planes=await planeService.getPlanes();//从web api获取所有平面
var信号量=新信号量lim(最大请求);
Func getDetailsAsync=async(id)=>
{
wait semaphore.WaitAsync();
尝试
{
var details=等待planeService.getDetails(id);
图纸详图(详图);
退货详情;
}
最后
{
semaphore.Release();
}
};
变量任务=平面。选择((平面)=>
getDetailsAsync(plane.id));
等待Task.WhenAll(tasks.ToArray());
}
并行运行的请求的合理数量是多少?飞机名单
可以是0到100个对象中的任何对象,通常最多20个
这在很大程度上取决于服务器,但我不认为有一个最终的答案。例如,检查以下问题:
就WP8客户端而言,我相信它可以生成100个并行请求而不会出现问题。我不知道网络连接的限制是什么,但会有一个限制 如果没有,唯一的问题将是用于保持这么多请求活动的内存量 因此,假设底层操作系统能够正确处理节流,我会这样做:
List<plane> planes = await planeService.getPlanes();
var allDetails = Task.WhenAll(from plane in plains
select planeService.getDetails(plane.id));
foreach(var details in allDetails)
{
drawDetails(details);
}
List planes=wait planeService.getPlanes();
var allDetails=Task.WhenAll(从平原中的平面)
选择planeService.getDetails(plane.id));
foreach(所有详细信息中的var详细信息)
{
图纸详图(详图);
}
注意:您应该遵循常见的命名约定,以帮助他人理解您的代码。异步方法的后缀应为Async,并且在*C#中,方法名称总是以CamelCase开头。知道合理的连接数是多少吗?由于im使用移动设备,我认为这可能与台式机上的情况有很大不同?WP8上无法访问ServicePointManager我想您会发现WP8对允许同时连接到主机的数量有限制。我听说大约是6-8点。这个限制会自动限制你的请求。@Darreller,谢谢,我相信你在这件事上。我还没有做过任何WP8的开发。