摘要:【SilverLight】存取Domain Service資料完成後的動作
剛開始學會用Domain Service存取資料時,我興沖沖的寫了一支小程式來測試:
public MainPage()
{
InitializeComponent();
Web.WCFDATA db = new Web.WCFDATA();
var data = db.Load(db.GetMsgQuery()).Entities;
MessageBox.Show(data.Count().ToString());
}
結果MessageBox秀出來的是0,這一點也不意外,我們都知道SilverLight必須依靠Domain Service來存取資料,且是以非同步的方式存取,資料還沒有讀取完,MessageBox已經先執行了,所以結果會是0。
這個結果告訴我們,撰寫SilverLight讀取資料時,必須特別注意非同步這個點,否則會出現意想不到的結果。
如果想在資料讀取完成後,秀出共有幾筆資料,上面的程式必須改寫,原本程式用的Load方法並沒有偵測資料讀取是否完成,我們必須用其他的方法,最後我找到了另一個Load方法,MSDN定義如下:
public LoadOperation<tentity> Load<tentity>(
EntityQuery<tentity> query,
Action<loadoperation><tentity> callback,
Object userState
)
where TEntity : Entity
其中第二個參數是一個Action<LoadOperation<TEntity>>委派,我們可以用這個列舉來執行資料完成後的動作。修改後的程式如下:
public MainPage()
{
InitializeComponent();
Web.WCFDATA db = new Web.WCFDATA();
db.Load(db.GetMsgQuery(), ShowMsg, null);
}
public void ShowMsg(LoadOperation<web.msg> m)
{
MessageBox.Show(m.Entities.Count().ToString());
}
原本我們是將db.Load的結果指定給data變數,然後去秀出data的筆數,修改後的程式我們新增一個符合Action<LoadOperation<TEntity>> 列舉的方法,然後帶入Load參數裡,這個方法可以取得Load回傳的LoadOperation