Silverlight 的超簡單同步方法

Silverlight 2.0 的正式版即將在 10 月份的時候進入 RTW (Release to Web,也就是開放下載的意思),我想一定很多很多人都很期待這個版本的到來,不過在這麼長的一段 Beta 試玩期中,有一些在 WPF 上或是以前 Windows Forms 開發的習慣還是沒辦法那麼快的轉過來,像是連到遠端去存取資料這個功能,在 Silverlight 上的方法就和在 WPF 或 Windows Forms 差很多,因為它是以非同步 (asynchronous) 為基礎,在 Silverlight 上做的遠端連接都是非同步。

Silverlight 2.0 的正式版即將在 10 月份的時候進入 RTW (Release to Web,也就是開放下載的意思),我想一定很多很多人都很期待這個版本的到來,不過在這麼長的一段 Beta 試玩期中,有一些在 WPF 上或是以前 Windows Forms 開發的習慣還是沒辦法那麼快的轉過來,像是連到遠端去存取資料這個功能,在 Silverlight 上的方法就和在 WPF 或 Windows Forms 差很多,因為它是以非同步 (asynchronous) 為基礎,在 Silverlight 上做的遠端連接都是非同步。

所以像是這樣的資料存取:

OnlineStoreEntities dbcontext = new OnlineStoreEntities(new Uri("http://localhost/OnlineStoreDataServices.svc/"));

var query = from c in dbcontext.ProductCategories
            select c;

// synchronous connection.
foreach (var queryItem in queryItems)
{
    TextBlock item = new TextBlock();
    item.Tag = queryItem.CategoryID;
    item.Text = queryItem.Name;
    this.lstCategoryList.Items.Add(item);
}

就會失敗,而拜 C# 9.0 的 Extension Method 以及 Anonymous Type 等性質的協助下,可以用下列的方式來存取資料:

OnlineStoreEntities dbcontext = new OnlineStoreEntities(new Uri("http://localhost/OnlineStoreDataServices.svc/"));

var query = from c in dbcontext.ProductCategories
            select c;

// For Silverlight's asynchronous data connection.
AsyncCallback ac = asyncResult =>
{
    var queryItems = (query as DataServiceQuery ).EndExecute(asyncResult);

    foreach (var queryItem in queryItems)
    {
        TextBlock item = new TextBlock();
        item.Tag = queryItem.CategoryID;
        item.Text = queryItem.Name;
        this.lstCategoryList.Items.Add(item);
    }

    this.labelMessage.Text = "";
};

this.labelMessage.Text = "Data Loading....";
(query as DataServiceQuery ).BeginExecute(ac, null);

這可比原來要切好幾個函式的方法來簡單多了。