c# - 从 Xamarin PCL 调用 REST API 时程序挂起

标签 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 (var client = new HttpClient())
        {
            var response = await client.GetAsync(endpoint);
            string content = await response.Content.ReadAsStringAsync();
            return await Task.Run(() => JsonConvert.DeserializeObject<T>(content));
        }
    }

我的程序就卡在这一行

var response = await client.GetAsync(endpoint);

没有抛出异常。

我在控制台应用程序中执行相同的代码,它工作正常。

我能看到的唯一区别是,在我的控制台应用程序中,我引用了 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 属性。您应该改为使用 await 关键字从任务中获取结果。

死锁的发生是因为同步上下文被两个不同的线程捕获。有关详细信息,请参阅此答案:await vs Task.Wait - Deadlock?

它在控制台应用程序中工作,因为 SynchronizationContext.Current 为空,因此不会发生死锁。有关详细信息,请参阅此帖子:Await, SynchronizationContext, and Console Apps

关于c# - 从 Xamarin PCL 调用 REST API 时程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36690340/

相关文章:

c# - 从 Xamarin Forms UWP 中的 Webview 获取内容高度

xamarin - 为什么我不能使用 Xamarin 在可移植类库中引用 System.Net.Sockets?

c# - 通过 P/Invoke 调用 GetGUIThreadInfo

c# - 什么是 WPF 应用程序服务

javascript - 操作 JSON : From basic JSON to more complex JSON with arrays?

java - Xamarin Android native 调用堆栈

c# - 在 .NET 2.0 中使用扩展方法?

c# - 双向绑定(bind)组合框到枚举

ios - 解析 JSON 帮助 IOS

javascript - 当查看其他开发人员的 javascript 代码时,我经常看到 JSON object/fn 习惯于解析 JSON?这个对象从哪里来?