从Web服务检索项目的最佳方法

时间:2014-07-30 04:51:08

标签: c# wpf web-services

我有一个WPF应用程序需要通过调用外部Web服务来检索大约60000条记录。 webservice在一个巨大的json中返回它们,一旦我收到它,我需要将它反序列化到我的对象列表中。最好的方法是什么,以便在加载过程中这个过程不会花费太长时间?

同样以同样的方式,在某些时候我需要发送相同的记录进行验证,但是我应该同时进行所有这些记录吗?

任何建筑建议都会受到赞赏,不需要代码,但需要一些方向(我可以用它来提高效率......)。

3 个答案:

答案 0 :(得分:3)

  1. 您可以使用调度程序来冻结WPF UI。
  2. 您可以使用Threadpool的线程来调用webservice。
  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来说太多了。