F#Silverlight RPC:预填充分页数据
感谢过去几个月来帮助我启动silverlight/f#原型(从VS-Ugh的RC版本开始)的所有人。我们试图解决的最后一个问题是RPC问题 我们需要能够对RPC调用进行分页,以便请求并绑定到网格并显示第一个页面,同时在后台预先填充otehr页面并将其连接在一起。我猜psuedo代码应该是这样的:F#Silverlight RPC:预填充分页数据,f#,F#,感谢过去几个月来帮助我启动silverlight/f#原型(从VS-Ugh的RC版本开始)的所有人。我们试图解决的最后一个问题是RPC问题 我们需要能够对RPC调用进行分页,以便请求并绑定到网格并显示第一个页面,同时在后台预先填充otehr页面并将其连接在一起。我猜psuedo代码应该是这样的: let pageNo = 1 let page1Data = JsonRpc.getSomeData(pageNo) let grid.datasource <- page1Data let
let pageNo = 1
let page1Data = JsonRpc.getSomeData(pageNo)
let grid.datasource <- page1Data
let grid.suspendFiltering <- true
// run the remainder in background
let allData : list ref = page1Data ref
for pageNo in [2..totalPages]
allData := allData @ JsonRpc.getSomeData(pageNo)
let grid.datasource <- allData
let grid.suspendFiltering <- true
让pageNo=1
让page1Data=JsonRpc.getSomeData(pageNo)
让grid.datasourcehmm。。。像这样的?(在浏览器中键入可能包含错误):
嗯。。。这个问题我已经读了一遍又一遍,不知道问题出在哪里。如果您想获取整个数据集,请公开一个JsonRpc.getAllData
方法来实现这一点。您的评论“另一个缺陷是需要使用回调将数据绑定到网格”没有上下文,因为据我所知,您的JsonRpc.getSomeData
方法看起来像一个同步方法,任何地方都没有回调的引用。唯一与众不同的是在循环中使用@
而不是更惯用的[yield!page1Data;因为totalPages中的pageNo确实yield!getSomeData(pageNo)]
我明白了(没有我需要的那么清楚)-假设每个分页请求需要2秒钟才能完成。如果我有10个页面,那么用户等待获取所有数据的时间就太长了。所以我想显示第一页,并在后台填充数据集的其余部分。在本例中,为了简单起见,我省略了回调。即使在一个更简单的模型中,我仍然需要显示一页数据,获取所有数据,然后将网格重新绑定到整个集合。。。这说明问题了吗?谢谢-这看起来像是我正在考虑实施的设计之一。我们只需在P1和afetr Pn之后调用两次“回调”。我不熟悉异步模块的细节,但它读起来很直接,我可以深入查找。非常感谢。还有人对这个设计有想法吗?
module Loader
open System
open System.Threading
let totalPages = 20
// emulation of long-running data loading routine
let private loadPageData (page : int) =
async {
do! Async.Sleep(1000)
return List.replicate 5 page
}
// loader - notifies UI about new data via callback
let loadAsync (callback : System.Action<_>) =
let syncContext = SynchronizationContext.Current
let doLoad = async {
// load first page and immediately feed it to callback
let! page1Data = loadPageData 1
do! Async.SwitchToContext syncContext
callback.Invoke(ResizeArray<_>(page1Data))
// load remaining data in the background
do! Async.SwitchToThreadPool()
let allData = ResizeArray<_>(page1Data)
for page in 2..totalPages do
let! pageData = loadPageData page
allData.AddRange(pageData)
do! Async.SwitchToContext syncContext
callback.Invoke(allData)
}
Async.Start doLoad
Loader.loadDataAsync(list => data.ItemSource = list)