【问题标题】:Xamarin cannot access disposed object errorXamarin 无法访问已处置的对象错误
【发布时间】:2016-09-18 10:00:07
【问题描述】:

我正在使用以下代码从 Xamarin 跨平台项目中的端点读取 JSON,但出现错误 无法读取已释放的对象异常或触发 ObjectDisposedException

代码有问题我可以用更好的方式编写吗?

public async Task<APISchoolDetailModel> GetSchooDetailsAsync()
{
    APISchoolDetailModel api_data = new APISchoolDetailModel();
    try
    {
        var client = new System.Net.Http.HttpClient();
        client.DefaultRequestHeaders.Add("Accept", "application/json");
        var web_client = await client.GetAsync("http://appapitest.net/APIs/Student/Schooldetails");
        var response_string= web_client.Content.ReadAsStringAsync().Result;                                              
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(api_data.GetType());               
        MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(response_string));
        api_data = serializer.ReadObject(ms) as APISchoolDetailModel;
    }
    catch (Exception ex) { }            
    return api_data;
}

控制器到达 var web_client = await client.GetAsync(" 行,然后它不再继续,几秒钟后我得到异常

有没有更好的方法来编写这段代码来读取和解析 JSON

【问题讨论】:

  • 您得到该异常的确切行是什么?因为我希望您的所有异常都基于空的 catch 块被吞没。
  • var response_string = web_client.Content.ReadAsStringAsync().Result - 不要那样做。做var response_string = await web_client.Content.ReadAsStringAsync().
  • 我在该行之前遇到异常。直到这条线才开始控制
  • @rene 请查看编辑
  • @JibinMathew 很可能 GSerg 所说的是真正的根本原因,因为:stackoverflow.com/a/24657079/578411

标签: c# xamarin.forms


【解决方案1】:

@Gserg 指出了一些重要的事情,你不应该这样做:

var response_string= web_client.Content.ReadAsStringAsync().Result;

代替那个用途:

var response_string= await web_client.Content.ReadAsStringAsync();

在异步任务方法中:

您是否使用 .Result 这可能会导致线程内的死锁或您遇到的相同问题,因为线程可能正在尝试更新或使用已从 GC 收集的变量。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2011-03-25
相关资源
最近更新 更多