C# Windows Phone,多个HTTP请求并行,有多少个?

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获取一个平面的详细信息 图纸详图(详图); } 我如何改进这一点,

在我的Windows Phone 8应用程序中,我正在从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的开发。