0

SharePoint用のSilverlightアプリを開発していて、リストからListItemsを取得したいと考えています。UIスレッドのブロックを回避するために、非同期でクエリを実行する必要があることはわかっています。通常、私はExecuteQueryAsyncを使用しますが、結果をDataGridソースとして設定したいので、それは機能しません。

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");
}

ShawnKendrotのソリューションを実装しました。

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(); 
4

2 に答える 2

1

私はSharePointのClientContextクラス(さらに言えばSharePoint)に精通していませんが、ドキュメントに非同期メソッドが表示されていません。この呼び出しに費用がかかる場合は、BackgroundWorkerで呼び出しをラップできます。BackgroundWorkerがクエリを実行し、結果を返すことができます。説明したようにソースを割り当てることはできませんが、代わりに、ワーカーが完了したときにソースを設定する必要があります。

    private void SetDataGridItemSource()
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += WorkerOnDoWork;
        worker.RunWorkerCompleted += WorkerOnRunWorkerCompleted;
        worker.RunWorkerAsync("name");       
    }

    private void WorkerOnDoWork(object sender, DoWorkEventArgs args)
    {
        if(args.Argument != null)
        {
            string name = args.Argument.ToString();
            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();

            args.Result = collListItems;
        }
    }

    private void WorkerOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
    {
        dataGrid.Source = args.Result as ListItemCollection;
    }
于 2012-08-13T16:33:36.350 に答える
0

このようなもの?

public delegate void ItemsLoadedCallback(IEnumerable<object> Entities);
public static void GetItemsFromList(string name, ItemsLoadedCallback Callback)
{
    // codesnip

    // Do async thing, on return call:
    if (Callback != null)
    {
        Callback(collListItems);
    }
}


private void SetDataGridItemSource()
{
    GetItemsFromList("name", (items) => dataGrid.Source = items);
}
于 2012-08-13T16:33:06.343 に答える