C# 带有Net.Http的Xamarin.Forms

C# 带有Net.Http的Xamarin.Forms,c#,xamarin,json.net,xamarin.forms,dotnet-httpclient,C#,Xamarin,Json.net,Xamarin.forms,Dotnet Httpclient,各位,你们能告诉我这段代码有什么问题吗?或者我可以用什么方式更改Xamarin设置以成功执行代码Xam.Plugin.Connectivity.CrossConnectivity表示:“设备已连接到互联网”,但在任何实现中DownloadCountriesListAsync()Stuck(UWP不起作用,Android也在清单中选择了互联网参数)。这段代码在c#控制台应用程序中运行 using System; using System.Collections.Generic; using Sys

各位,你们能告诉我这段代码有什么问题吗?或者我可以用什么方式更改Xamarin设置以成功执行代码
Xam.Plugin.Connectivity.CrossConnectivity
表示:“设备已连接到互联网”,但在任何实现中
DownloadCountriesListAsync()
Stuck(UWP不起作用,Android也在清单中选择了互联网参数)。这段代码在c#控制台应用程序中运行

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace radacodeTestApp
{
    public class ListsDownloader
    {
        public List<Country> Countries { get; private set; }

        public ListsDownloader()
        {
            Countries = new List<Country>();
            var task = DownloadCountriesListAsync();
        }

        public async Task<bool> DownloadCountriesListAsync()
        {
            try
            {
                var vkjsonResponse = await GetResponse(@"https://api.vk.com/api.php?oauth=1&method=database.getCountries&need_all=1&v=5.60");
                var jsonObject = JObject.Parse(vkjsonResponse);
                foreach (var jO in jsonObject["response"]["items"])
                    Countries.Add(JsonConvert.DeserializeObject<Country>(jO.ToString()));

            }
            catch (OperationCanceledException)
            {
                return false;
            }
            return true;
        }

        public async Task<string> GetResponse(string url)
        {
            using (var httpClient = new HttpClient())
                return await httpClient.GetStringAsync(url);

        }


    }
    public class Country
    {
        public int Cid { get; set; }
        public string Title { get; set; }
        public override string ToString()
        {
            return Title;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Net.Http;
使用System.Threading.Tasks;
使用Newtonsoft.Json;
使用Newtonsoft.Json.Linq;
名称空间radacodeTestApp
{
公共类ListsDownloader
{
公共列表国家{get;private set;}
公共列表下载器()
{
国家=新名单();
var task=DownloadCountriesListAsync();
}
公共异步任务下载CountriesListAsync()
{
尝试
{
var vkjsonResponse=await GetResponse(@)https://api.vk.com/api.php?oauth=1&method=database.getCountries&need_all=1&v=5.60");
var jsonObject=JObject.Parse(vkjsonResponse);
foreach(jsonObject[“响应”][“项”]中的var jO)
Add(JsonConvert.DeserializeObject(jO.ToString());
}
捕获(操作取消异常)
{
返回false;
}
返回true;
}
公共异步任务GetResponse(字符串url)
{
使用(var httpClient=new httpClient())
返回wait-httpClient.GetStringAsync(url);
}
}
公营国家
{
公共int-Cid{get;set;}
公共字符串标题{get;set;}
公共重写字符串ToString()
{
返回标题;
}
}
}

从后台线程调用
DownloadCountriesListAsync
方法;您的代码当前正在从主线程(也称为UIThread)调用
DownloadCountriesListAsync
,这可能会导致UIThread冻结

我已经更新了下面的代码,以显示如何从后台线程调用
DownloadCountriesListAsync
方法

Async/Await是一个棘手的问题。将方法标记为异步并不意味着它将自动在后台线程上运行;这仅仅意味着异步方法能够将其进程交付给其父线程,直到其进程完成。在最近的Xamarin会议上做了关于Async/Await的精彩演示。我强烈推荐它

使用系统;
使用System.Collections.Generic;
使用System.Net.Http;
使用System.Threading.Tasks;
使用Newtonsoft.Json;
使用Newtonsoft.Json.Linq;
名称空间radacodeTestApp
{
公共类ListsDownloader
{
公共列表国家{get;private set;}
公共列表下载器()
{
国家=新名单();
运行(async()=>wait DownloadCountriesListAsync());
}
公共异步任务下载CountriesListAsync()
{
尝试
{
var vkjsonResponse=await GetResponse(@)https://api.vk.com/api.php?oauth=1&method=database.getCountries&need_all=1&v=5.60");
var jsonObject=JObject.Parse(vkjsonResponse);
foreach(jsonObject[“响应”][“项”]中的var jO)
Add(JsonConvert.DeserializeObject(jO.ToString());
}
捕获(操作取消异常)
{
返回false;
}
返回true;
}
公共异步任务GetResponse(字符串url)
{
使用(var httpClient=new httpClient())
返回wait-httpClient.GetStringAsync(url);
}
}
公营国家
{
公共int-Cid{get;set;}
公共字符串标题{get;set;}
公共重写字符串ToString()
{
返回标题;
}
}
}

你不会也不可能等待它完成。不要在构造函数中这样做。我不会在构造函数中等待完成。仔细观察;这就是问题所在,这是异步进程。它很适合它。问题是另一面。这个过程在获取http响应时遇到了困难,等待结果的程序可以完全停止运行。谢谢你们,布兰登
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace radacodeTestApp
{
    public class ListsDownloader
    {
        public List<Country> Countries { get; private set; }

        public ListsDownloader()
        {
            Countries = new List<Country>();
            Task.Run(async () => await DownloadCountriesListAsync());
        }

        public async Task<bool> DownloadCountriesListAsync()
        {
            try
            {
                var vkjsonResponse = await GetResponse(@"https://api.vk.com/api.php?oauth=1&method=database.getCountries&need_all=1&v=5.60");
                var jsonObject = JObject.Parse(vkjsonResponse);
                foreach (var jO in jsonObject["response"]["items"])
                    Countries.Add(JsonConvert.DeserializeObject<Country>(jO.ToString()));

            }
            catch (OperationCanceledException)
            {
                return false;
            }
            return true;
        }

        public async Task<string> GetResponse(string url)
        {
            using (var httpClient = new HttpClient())
                return await httpClient.GetStringAsync(url);
        }
    }

    public class Country
    {
        public int Cid { get; set; }
        public string Title { get; set; }
        public override string ToString()
        {
            return Title;
        }
    }
}