我想在通用Windows平台中使用类HttpClient
快速检查本地网络中IP地址的范围,以获得给定URI的http成功200
如果成功,则添加到列表中。如果失败快速放弃,则转到迭代中的下一个。
这是我使用的示例代码。
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;
}
}
}
这种方法很慢,但有效。知道怎么加快速度吗?
不要等到上一个任务完成后再调用SendHttpRequest。
您可以将它们全部添加到Task[]
,然后在最后调用WhenAll。类似这样的东西:
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);
除此之外,您可以将HttpClient Timeout
设置为更短的值,以使请求更快地超时。
client.Timeout = TimeSpan.FromMilliseconds(4000);
编辑:我根据评论更新了代码!
编辑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());
}
}