【SilverLight】存取Domain Service資料完成後的動作

摘要:【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,接著用取得的回傳值去秀出筆數,執行後果然可以正確秀出筆數。