2010-08-05 93 views
2

感謝所有在過去幾個月裏幫助過我的人,試圖幫助我使Silverlight/f#原型啓動並運行(從VS版本開始 - Ugh)。我們試圖解決的最後一個問題是RPC問題。F#Silverlight RPC:預填充分頁數據

我們需要能夠對RPC調用進行分頁,這樣第一頁被請求並綁定到網格並顯示,而otehr頁面在後臺預填充並連接在一起。我猜的僞代碼是這樣的:

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 

我appologize對於上面的代碼,我試圖使它作爲F#像越好(在本文撰寫窗口);另一個缺陷是需要使用回調將數據綁定到網格等。

問題方法可能用於解決這個問題,什麼是最合適的?

+0

Hmmmmm ......我讀過這一遍又一遍的問題,並不能找出問題所在。如果你想得到你的整個數據集,請公開一個'JsonRpc.getAllData'方法來做到這一點。你的評論*「另一個缺陷是需要使用回調來將數據綁定到網格」*沒有上下文,因爲就我所知,你的'JsonRpc.getSomeData'方法看起來像一個同步方法,沒有參考到任何地方回調。唯一不尋常的是在循環中使用'@'而不是更習慣''yield! page1Data;頁面總頁數沒有收益! getSomeData(pageNo)]' – Juliet 2010-08-05 18:07:03

+0

我看到了(不像我需要的那麼清晰) - 讓我們說每個分頁請求需要2秒來填充。如果我有10頁太長,用戶無法等待獲取所有數據。所以我想要顯示第一頁並在後臺填入其餘的數據集。在這個例子中,爲了簡單起見,我確實省略了回調。即使在一個更簡單的模型中,我仍然需要顯示一頁數據,獲取所有數據,然後將網格重新綁定到整個集合... 這是否澄清事情? – akaphenom 2010-08-06 02:00:57

回答

1

嗯...這樣的事情? (在瀏覽器中輸入,所以可能包含錯誤):

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 

在UI方面會出現這樣的(即數據 - 列表框或其他一些控制)

Loader.loadDataAsync(list => data.ItemSource = list) 
+0

謝謝 - 這實際上看起來像我正在考慮實施的設計之一。我們只需在P1之後加載兩次「回調」,然後再打開Pn。我對Async模塊的細節並不熟悉 - 但它直截了當,並且可以深入查看它。謝謝。其他人對這種設計有什麼想法嗎? – akaphenom 2010-08-09 13:40:24