C# 从Xamarin PCL调用REST API时,程序挂起

C# 从Xamarin PCL调用REST API时,程序挂起,c#,json,xamarin,xamarin.android,portable-class-library,C#,Json,Xamarin,Xamarin.android,Portable Class Library,我的Xamarin PCL中有以下代码 public Product Product(int id) { var product = Get<Product>(endpoint + "?id=" + id).Result; return product; } static async Task<T> Get<T>(string endpoint) { using (va

我的Xamarin PCL中有以下代码

    public Product Product(int id)
    {

        var product = Get<Product>(endpoint + "?id=" + id).Result;
        return product;
    }

    static async Task<T> Get<T>(string endpoint)
    {
        using (var client = new HttpClient())
        {
            var response = await client.GetAsync(endpoint);
            string content = await response.Content.ReadAsStringAsync();
            return await Task.Run(() => JsonConvert.DeserializeObject<T>(content));
        }
    }
没有引发异常

我在一个控制台应用程序中执行相同的代码,它运行良好

我能看到的唯一区别是,在我的控制台应用程序中,我正在
lib\net45
文件夹中引用
Newtonsoft.Json.dll
。在我的Xamarin PCL项目中,我正在
lib\portable-net40+sl5+wp80+win8+wpa81
文件夹中引用
Newtonsoft.Json.dll
。我尝试在
lib\portable-net45+wp80+win8+wpa81+dnxcore50
文件夹中引用dll,结果相同


我使用的是Json 8.0.3,代码挂起是因为您正在访问任务的
Result
属性。您应该改为使用
wait
关键字从任务中获取结果

发生死锁是因为同步上下文由两个不同的线程捕获。有关更多详细信息,请参阅此答案:


它在控制台应用程序中工作,因为SynchronizationContext.Current为空,所以不会发生死锁。有关更多详细信息,请参阅本文:

您正在通过访问Result属性强制异步操作在同步方法中运行

public async Task<Product> Product(int id)
{

    var product = await Get<Product>(endpoint + "?id=" + id);
    return product;
}
公共异步任务产品(int-id)
{
var product=等待获取(端点+“?id=“+id”);
退货产品;
}
按上述方式修改产品方法将解决此问题

public async Task<Product> Product(int id)
{

    var product = await Get<Product>(endpoint + "?id=" + id);
    return product;
}