我正在開發一個適用於SharePoint的Silverlight應用程序,並希望從列表中獲取ListItems。我知道我需要異步查詢以避免阻塞UI線程。通常我使用ExecuteQueryAsync,但是由於我喜歡將結果設置爲DataGrid源,因此無法工作。如何在Silverlight 4中異步調用方法?
如何異步調用GetItemsFromList方法,並將結果設置爲DataGrid源而不會產生太多的代碼開銷? (拉姆達?)
SharePointHelper類:
public static ListItemCollection GetItemsFromList(string name)
{
var context = ClientContext.Current;
var targetList = context.Web.Lists.GetByTitle("ListName");
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = string.Format("<View><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>{0}</Value></Eq></Where></Query>RowLimit>4</RowLimit></View>",
name);
ListItemCollection collListItems = targetList.GetItems(camlQuery);
context.ExecuteQuery();
return collListItems;
}
UI類:
private void SetDataGridItemSource()
{
dataGrid.Source = GetItemsFromList("name");
}
我現在已經實現從肖恩Kendrot解決方案:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (sender, args) =>
{
args.Result = SharePointHelpers.GetItemsFromList("name");
};
worker.RunWorkerCompleted += (s, e) => dataSource.Source = e.Result as ListItemCollection;
worker.RunWorkerAsync();
這將工作,但對於此解決方案,我需要爲每個我喜歡打電話的方法添加一個BackgroundWorker,並且必須註冊該事件。我希望像@丹Wray嘗試更好的解決方案;-) – jwillmer 2012-08-13 16:59:29
使用回調和訂閱事件本質上是一回事。由於這些方法看起來不是異步的,所以您需要使它們異步。 BackgroundWorker使這成爲可能。如果您不喜歡擁有完整的方法,只需將事件訂閱更改爲:worker.RunWorkerCompleted + =(s,e)=> dataGrid.Source = e.Result as ListItemCollection; – 2012-08-13 18:36:37