【问题标题】:UI getting blocked in deserializing JSONUI 在反序列化 JSON 时被阻止
【发布时间】:2017-04-29 05:33:50
【问题描述】:

我正在使用 HttpClient 从 Web 服务获取数据并将其存储到 Realm 数据库中。我的屏幕会自动开始获取数据并显示ActivityIndicator,直到数据被加载并存储在数据库中。

现在的问题是,我有很多数据要使用 JsonConvert.DeserializeObject<Response>(content) 反序列化,因为数据很大,这个语句会在 UI 屏幕上阻塞/冻结我的 ActivityIndicator

我怎样才能在后台线程中反序列化对象,这样它就不会阻塞 UI。

这是我的代码

 var response = await Service.createService<HttpResponseMessage>("HTTP").sendData(url, jsonData);

                if (response.IsSuccessStatusCode)
                    {

                        var content = await response.Content.ReadAsStringAsync();
                        Response responseData = JsonConvert.DeserializeObject<Response>(content);
                        DB.createDB<EventType>("realm").subscribe();

                    if (responseData != null)
                        {
                            // status is ok
                            if (responseData.status.ToUpper() == OK)
                            {

                            MessagingCenter.Send<IMessage, EventType>(this, DB_EVENT, new EventTypeBuilder().status(true).requestType(url).response(responseData).Build());

                            }// status is error
                            else if (responseData.status.ToUpper() == ERROR)
                            {

                                MessagingCenter.Send<IMessage, EventType>(this, UI_EVENT, new EventTypeBuilder().status(false).requestType(url).errorMessage(responseData.errorMessage).Build());

                            }


                        }
                        else // when response is null

                            MessagingCenter.Send<IMessage, EventType>(this, UI_EVENT, new EventTypeBuilder().status(false).requestType(url).errorMessage(ERROR_RESPONSE_NULL).Build());


                    }
                    else
                    { // when some error occured
                        response.EnsureSuccessStatusCode();


                    }

Response responseData = JsonConvert.DeserializeObject&lt;Response&gt;(content); 阻塞了我的线程

【问题讨论】:

    标签: c# multithreading xamarin realm


    【解决方案1】:

    您可以在自己的线程上运行它并等待结果:

    Response responseData;
    await Task.Run(() => 
    {
         responseData = JsonConvert.DeserializeObject<Response>(content);
         // preform your Realm database add/updates, 
         // remember you are now on a different thread so get a new Realm Instance
    });
    

    回复:Task.Run Method (Action)

    将指定的工作排入队列以在线程池上运行,并返回一个代表该工作的 Task 对象。

    【讨论】:

    • 简单一点:var responseData = await Task.Run(() =&gt; JsonConvert.DeserializeObject&lt;Response&gt;(content));
    • 也建议var responseData = await Task.Run(() =&gt; JsonConvert.DeserializeObject&lt;Response&gt;(content)).ConfigureAwait(false);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多