C# 如何在UWP中使用HttpClient时快速检查具有IP地址范围的http成功200

C# 如何在UWP中使用HttpClient时快速检查具有IP地址范围的http成功200,c#,win-universal-app,uwp,dotnet-httpclient,C#,Win Universal App,Uwp,Dotnet Httpclient,我想在通用Windows平台中使用classHttpClient快速检查本地网络中的IP地址范围,以获得给定URI的http成功 如果成功添加到列表中。若失败,快速放弃,进入迭代中的下一步 下面是我使用的示例代码 private async void ScanLocalNetwork() { string localIpAddress = GetLocalIpAddress(); if (!string.IsNullOrEmpty(localIpAddress)

我想在通用Windows平台中使用class
HttpClient
快速检查本地网络中的IP地址范围,以获得给定URI的http成功

如果成功添加到列表中。若失败,快速放弃,进入迭代中的下一步

下面是我使用的示例代码

private async void ScanLocalNetwork()
{
        string localIpAddress = GetLocalIpAddress();

        if (!string.IsNullOrEmpty(localIpAddress))
        {
            List<IPAddress> IpAddressList = new List<IPAddress>();
            IpAddressList = GetListOfLocalIpAddresses(localIpAddress);
            ListOfScannedIpAddresses = new ObservableCollection<string>();

            foreach (var ipAddress in IpAddressList)
            {                    
                IsSearchingVisible = true; //show progress ring for list

                var validAddress = await SendHttpRequest(ipAddress.ToString());

                if (validAddress)
                {
                    ListOfScannedIpAddresses.Add(ipAddress.ToString());                        
                }
            }

            IsIpListVisible = true;
            IsSearchingVisible = false;
        }
}

private async Task<bool> SendHttpRequest(string ipAddressToCheck)
    {
        HttpResponseMessage reposneMsg;
        string address = String.Empty;


        address = "http://" + ipAddressToCheck + "/RemoteControl/Volume/get";
        var uri = new Uri(address, UriKind.Absolute);

        using (HttpClient client = new HttpClient())
        {
            //IsChecking = true;
            try
            {
                reposneMsg = await client.GetAsync(uri);
                return reposneMsg.IsSuccessStatusCode;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
private async void ScanLocalNetwork()
{
字符串localIpAddress=GetLocalIpAddress();
如果(!string.IsNullOrEmpty(localIpAddress))
{
List IpAddressList=新列表();
IpAddressList=GetListOfLocalIpAddresses(localIpAddress);
ListofScaneDipAddresses=新的ObservableCollection();
foreach(IpAddressList中的变量ipAddress)
{                    
IsSearchingVisible=true;//显示列表的进度环
var validAddress=等待发送HttpRequest(ipAddress.ToString());
如果(有效服装)
{
添加(ipAddress.ToString());
}
}
IsIpListVisible=true;
IsSearchingVisible=false;
}
}
专用异步任务SendHttpRequest(字符串ipAddressToCheck)
{
httpresponsemessagereposnemsg;
字符串地址=string.Empty;
address=“http://”+ipAddressToCheck+“/RemoteControl/Volume/get”;
var uri=新的uri(地址,UriKind.Absolute);
使用(HttpClient=new HttpClient())
{
//IsChecking=true;
尝试
{
reposneMsg=await client.GetAsync(uri);
return reposneMsg.issucessStatusCode;
}
捕获(例外)
{
返回false;
}
}
}

这种方法很慢,但很有效。知道如何加快速度吗?

不要等到上一个任务完成后再调用SendHttpRequest

您可以将它们全部添加到
任务[]
,然后单击。大概是这样的:

Task[] tasks = new Task[IpAddressList.Count];
for (int i = 0; i < IpAddressList.Count; i++)
{
    Task task = SendHttpRequest(IpAddressList[i].ToString());
    tasks[i] = task;
}

await Task.WhenAll(tasks);
编辑:我根据评论更新了代码

编辑2:将任务结果添加到任务数组后,您立即对其进行评估,这不符合目的。首先启动所有任务,然后等待它们全部完成,然后查看任务结果列表并获取所需的IP地址

Task[] tasks = new Task[IpAddressList.Count];
for (int i = 0; i < IpAddressList.Count; i++)
{
    Task<bool> task = SendHttpRequest(IpAddressList[i].ToString());

    tasks[i] = task;
}

await Task.WhenAll(tasks);

for (int i = 0; i < tasks.Length; i++)
{
    if (tasks[i].Result)
    {
        ListOfScannedIpAddresses.Add(IpAddressList[i].ToString());
    }
}
Task[]tasks=新任务[IpAddressList.Count];
对于(int i=0;i
使用
Parallel.ForEach
循环,但我认为您应该将
observeCollection
更改为一些线程安全的集合。我已经检查了Parallel.ForEach,但这个被阻止的UI是我不想要的。我认为异步在这里没有问题,但是httpClient的响应很慢,直到放弃为止。或者你能详细说明一下吗?如果你一次打完所有电话,然后等待所有电话都返回,而不是只打一个电话,然后等待,那么总体来说应该更快,然后是另一个调用&等待等。您也可以尝试设置客户端。超时以使请求更快超时…?对热任务调用
task.Start
将导致异常。另外,您正在使用
WaitAll
进行阻止。您可能想在
上等待所有的
。我尝试了任务迭代,但这阻止了用户界面。。。或者我不知道如何用igrali建议的方式使用它:关于client.Timeout,我最初发布的方法几乎快了一半,所以我认为它是可以接受的。但现在任务迭代并没有让我休息。。。
Task[] tasks = new Task[IpAddressList.Count];
for (int i = 0; i < IpAddressList.Count; i++)
{
    Task<bool> task = SendHttpRequest(IpAddressList[i].ToString());

    tasks[i] = task;
}

await Task.WhenAll(tasks);

for (int i = 0; i < tasks.Length; i++)
{
    if (tasks[i].Result)
    {
        ListOfScannedIpAddresses.Add(IpAddressList[i].ToString());
    }
}