如何使用UWP中的BeginExecute分页来异步使用WCF数据服务

时间:2015-11-26 13:32:20

标签: c# wcf-data-services uwp

我有一个WCF数据服务服务,它的方法返回可查询列表。

使用Java库,我可以使用客户端分页(使用toptake)来使用它。

现在我打算用UWP应用程序来使用它。

不幸的是,以下代码不起作用:

var result = client.CreateQuery<Information>("GetInformation")
             .AddQueryOption("id", string.Format("'{0}'", actualId))
             .Skip(index)
             .Take(amount).ToList();

我得到了这个例外:

  

此目标框架不允许您直接枚举a   数据服务查询。这是因为枚举自动发送一个   对数据服务的同步请求。因为这个框架而已   支持异步操作,你必须改为调用   BeginExecute和EndExecute方法获取查询结果   支持枚举。

由于我必须使用BeginExecute,我无法再使用SkipTake

var query = client.CreateQuery<Information>("GetInformation")
                  .AddQueryOption("id", string.Format("'{0}'", actualId));
query.BeginExecute((x) =>
          {
            var result= query.EndExecute(x);
            foreach (var information in result)
            {

            };                       
          }, null);

我应该如何使用这种异步方法呢?

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,但是有了OData。 我在下一篇博文http://jqyblogger.blogspot.com/2013/11/linq-query-error-message-on-windows.html中找到了解决方案,基本上我们需要使用asyncronus工具进行OData。

            Default.Container context = new Default.Container(new Uri("url_to_OData_Service"));
        var nquery = context.Reports
                               .Where(r => r.ReportId == 1)
                               .Select(p => p);

        DataServiceQuery<Report> query = (DataServiceQuery<Report>)nquery;

        TaskFactory<IEnumerable<Report>> taskFactory = new TaskFactory<IEnumerable<Report>>();
        IEnumerable<Report> result = await taskFactory.FromAsync(query.BeginExecute(null, null), iar => query.EndExecute(iar));