Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Sharepoint 2010: Client object model & Silverlight – asynchroner Ansatz

Im vor­an­ge­gan­ge­nen Blogbeitrag über das Client object model, habe ich beschrie­ben wie mit­tels Context.Executequery() eine syn­chrone Anfrage an den Sharepoint Server abge­setzt wer­den kann. In die­sem Eintrag werde ich das Gegenstück Context.ExecuteQueryAsync() etwas näher beleuch­ten. Es ist etwas ver­wir­rend, dass Microsoft hier zwei Methoden anbie­tet, um Anfragen an Sharepoint zu sen­den. Als ich erst­ma­lig die Methode ExecuteQuery() auf­ge­ru­fen habe, erhielt ich eine Exception, wel­che mir mit­teilte, dass ich diese Methode nicht in einem UI Thread auf­ru­fen darf.

InvalidOperationException. The method or property that is called may block the UI thread and it is not allowed.

Aus die­sem Grund, muss bei Verwendung der Methode ExecuteQuery(), in einem UI Prozess, ein Thread gewählt wer­den, wel­cher das UI nicht beein­träch­tigt.

ThreadPool.QueueUserWorkItem(new WaitCallback(LoadSharepointContext));

Nach einer kur­zen Suche bin ich auf die Erklärung der MSDN gesto­ßen.

The Silverlight cli­ent object model pro­vi­des both an ExecuteQuery()  method, which can be cal­led syn­chro­nously from threads that do not modify the user inter­face (UI), and an asyn­chro­nous ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) method for cases where threads do modify the UI

Soll das Laden der Sharepoint Daten in einem User Interface Thread erfol­gen, muss also zwin­gend die Asynchrone Methode ver­wen­det wer­den. Falls der Programmcode keine Änderung an der UI vor­nimmt, kann wei­ter­hin die syn­chrone Methode ver­wen­det wer­den.  Wie die asyn­chrone Query zu ver­wen­den ist, zeige ich im nach­fol­gen­dem Beispiel.

Voraussetzungen für die­ses Beispiel:

Die Voraussetzungen für die­ses Beispiel sind ana­log der, des ers­ten Blogeintrages:

  • instal­lier­tes Visual Studio, Sharepoint 2010 sowie ein ange­leg­tes Silverlight Projekt
  • unbe­dingt auf die Verwendung der Clientaccesspolicy ach­ten( siehe vor­he­ri­ger Eintrag)

Los geht's:

1. Es sind die Schritte 1. – 6. des Blogeintrages "Sharepoint 2010: Client object model & Silverlight – syn­chro­ner Ansatz" aus­zu­füh­ren.

2. Die Abarbeitung der Query var­riert jedoch zu dem syn­chro­nen Ansatz.

ClientContext clientCxt = new ClientContext("http://siteCollectionAdresse");
List shoppingList = clientCxt.Web.Lists.GetByTitle("Einkauf");
CamlQuery query = CamlQuery.CreateAllItemsQuery();
ListItemCollection listItems = shoppingList.GetItems(query);
clientCxt.Load(listItems);
clientCxt.ExecuteQueryAsync(new ClientRequestSucceededEventHandler(OnSuccess), new ClientRequestFailedEventHandler(OnFailed));

Wie zu erken­nen, wird dies­mal die Methode "ExecuteQueryAsync" auf­ge­ru­fen. Diese benö­tigt als Paramater einen ClientRequestSucceededEventHandler sowie einen ClientRequestFailedEventHandler. Beide wer­den wie folgt erzeugt:

private void OnSuccess(Object sender, ClientRequestSucceededEventArgs args)
{
}
private void OnFailed(Object sender, ClientRequestFailedEventArgs args)
{
}

3. Bei erfolg­rei­cher Abarbeitung der Anfrage, sollte diese im Successhandler lan­den, wo die wei­tere Verarbeitung der Daten statt­fin­den kann.

private void OnSuccess(Object sender, ClientRequestSucceededEventArgs args)
{
            foreach (ListItem item in listItems)
            {
                einkaufList.Add(new EinkaufData
                {
                    Title = item["Title"].ToString(),
                    Details = item["Details"].ToString(),
                    Preis = item["Preis"].ToString()
                });
            }
}

4. Achtung: Die Verarbeitung in OnSuccess fin­det in einem sepa­ra­ten Thread statt (nicht UI Thread). Nimmt man Änderungen an dem User Interface vor, muss der Dispatcher ver­wen­det wer­den.

disp.BeginInvoke(() =>
{
   dataGrid.ItemsSource = einkaufList;
});

5. Ist alles erfolg­reich gela­den, sollte das Datagrid wie folgt aus­se­hen.

Related Posts

[…] Dieser Eintrag wurde auf Twitter von Planet SharePoint, Torsten Hufsky erwähnt. Torsten Hufsky sagte: Jetzt der asyn­chrone Ansatz: Now im #Communardo #Techblog 🙂 http://bit.ly/8Lrykb […]

#Sharepoint 2010: Client object model & #Silverlight – ansyn­chro­ner Ansatz http://ow.ly/XAIk #fb
This com­ment was ori­gi­nally pos­ted on Twitter

#Sharepoint 2010: Client object model & #Silverlight – syn­chro­ner Ansatz http://ow.ly/XAIw #fb
This com­ment was ori­gi­nally pos­ted on Twitter

Comments are closed.

Pin It on Pinterest