2015-11-04 78 views
0

使用的HttpClient我想在通用的Windows平台如何快速检查HTTP成功IP地址具有范围200,而在UWP

定的URI使用类 HttpClient的HTTP成功200在本地网络IP地址的快速检查范围

如果成功添加到列表。如果失败放弃快速下一步迭代。

这里是我使用的示例代码。

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; 
      } 
     } 
    } 

这种方法虽然速度慢,但有效。任何想法如何加快速度呢?

+0

使用'Parallel.ForEach'循环,但我想你应该改变'ObservableCollection'为一些线程安全的集合。 –

+0

我检查了Parallel.ForEach,但是这阻止了我不想要的UI。 – hal9k2

回答

0

在再次调用SendHttpRequest之前,不要等待上一个任务完成。

您可以将它们全部添加到Task[],然后call WhenAll in the end。事情是这样的:

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); 

Othen,你可以在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()); 
    } 
} 
+0

我认为这里没有异步问题,但是直到放弃之前,httpClient的响应速度很慢。或者,也许你可以详细说明一下吗? – hal9k2

+0

好吧,如果你立即开启了所有的呼叫,然后等待所有的呼叫返回而不是一次呼叫,然后等待,然后再等待一次,等等,那么它应该会更快。您还可以尝试设置客户端。超时以更快地获取超时请求...? –

+0

在热任务中调用'task.Start'会导致异常。另外,你使用'WaitAll'来阻止。你可能想等待'WhenAll'。 –