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
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
這可比原來要切好幾個函式的方法來簡單多了。