我有一个WPF应用程序需要通过调用外部Web服务来检索大约60000条记录。 webservice在一个巨大的json中返回它们,一旦我收到它,我需要将它反序列化到我的对象列表中。最好的方法是什么,以便在加载过程中这个过程不会花费太长时间?
同样以同样的方式,在某些时候我需要发送相同的记录进行验证,但是我应该同时进行所有这些记录吗?
任何建筑建议都会受到赞赏,不需要代码,但需要一些方向(我可以用它来提高效率......)。
答案 0 :(得分:3)
创建一个用于调用webservice的类
Class Source
{
public string GetJson()
{
}
}
在WPF MainWindow.xaml.cs
中创建一个方法,用于调用我们在上面创建的webservice类
private void CallWebserviceClass(Object state)
{
//Create object for webservice class, In our case Source class
Source obj = new Source();
string data = obj.GetJson();
//Use `Dispatcher` to update the UI
this.Dispatcher.BeginInvoke(new Action<string>(UpdateUI), data);
}
Private void UpdateUI(string data)
{
//Update UI, Bind your data to WPF controls
}
// Call the `CallWebserviceClass` method on different thread
ThreadPool.QueueUserWorkItem(CallWebserviceClass);
答案 1 :(得分:1)
首先,如果您有更改Web服务的范围,那么您将不会比JSON更好。但是,您可以查看缩短数据类型中的任何字段名称,以便最小化文件中的标题 - 即。如果您的记录对象包含“accountNumber”之类的字段,请将其更改为“AN”,即从响应中删除600k x 11个字符。 JSON旨在发送Ks的数据,而不是MB - 但他们期望的是什么!
接下来,如果您可以在获得记录后立即开始“验证”,请考虑在服务响应中添加分页 - 例如,以50k块的形式返回记录,这样在下载第二个块时,您可以验证第一个块。
根据建议,通过提供一些反馈来改善用户体验,即进度条或状态消息。使这个数据操作运行异步,您的应用程序可以让用户在加载时执行其他操作吗?
这些是建议,您需要衡量任何影响,看看它是否有所改善。
Web API中具有可查询数据集的分页示例:
public async Task<object> GetData(int page, int pagesize)
{
return await Task.Factory.StartNew<object>(() =>
{
return dataset.Skip(page * pagesize).Take(pagesize);
});
}
...其中'object'是您的记录类型,'dataset'可能是实体框架DataSet。
传递请求中的页面和pagesize属性 - 然后您可以通过调整页面大小来微调性能。从您的客户端循环,直到结果集的记录少于pagesize。
答案 2 :(得分:0)
这样做。简单,肮脏,直接。
测量它。
必要时改进它。也许把它放在后台线程中。
这很普遍,但有60K项目是非常笼统的描述。发送60K整数是轻而易举的,发送60K结构或包含图片的结构化子数据可能对你的RAM来说太多了。