C# 如何在UWP中使用HttpClient时快速检查具有IP地址范围的http成功200
我想在通用Windows平台中使用classC# 如何在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)
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());
}
}