Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/850 33-0

Sharepoint 2010: Client object model & Silverlight – asynchroner Ansatz

Im vorangegangenen Blogbeitrag über das Client object model, habe ich beschrieben wie mittels Context.Executequery() eine synchrone Anfrage an den Sharepoint Server abgesetzt werden kann. In diesem Eintrag werde ich das Gegenstück Context.ExecuteQueryAsync() etwas näher beleuchten. Es ist etwas verwirrend, dass Microsoft hier zwei Methoden anbietet, um Anfragen an Sharepoint zu senden. Als ich erstmalig die Methode ExecuteQuery() aufgerufen habe, erhielt ich eine Exception, welche mir mitteilte, dass ich diese Methode nicht in einem UI Thread aufrufen darf.

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

Aus diesem Grund, muss bei Verwendung der Methode ExecuteQuery(), in einem UI Prozess, ein Thread gewählt werden, welcher das UI nicht beeinträchtigt.

ThreadPool.QueueUserWorkItem(new WaitCallback(LoadSharepointContext));

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

The Silverlight client object model provides both an ExecuteQuery()  method, which can be called synchronously from threads that do not modify the user interface (UI), and an asynchronous ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) method for cases where threads do modify the UI

Soll das Laden der Sharepoint Daten in einem User Interface Thread erfolgen, muss also zwingend die Asynchrone Methode verwendet werden. Falls der Programmcode keine Änderung an der UI vornimmt, kann weiterhin die synchrone Methode verwendet werden.  Wie die asynchrone Query zu verwenden ist, zeige ich im nachfolgendem Beispiel.

Voraussetzungen für dieses Beispiel:

Die Voraussetzungen für dieses Beispiel sind analog der, des ersten Blogeintrages:

  • installiertes Visual Studio, Sharepoint 2010 sowie ein angelegtes Silverlight Projekt
  • unbedingt auf die Verwendung der Clientaccesspolicy achten( siehe vorheriger Eintrag)

Los geht’s:

1. Es sind die Schritte 1. – 6. des Blogeintrages „Sharepoint 2010: Client object model & Silverlight – synchroner Ansatz“ auszuführen.

2. Die Abarbeitung der Query varriert jedoch zu dem synchronen 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 erkennen, wird diesmal die Methode „ExecuteQueryAsync“ aufgerufen. Diese benötigt als Paramater einen ClientRequestSucceededEventHandler sowie einen ClientRequestFailedEventHandler. Beide werden wie folgt erzeugt:

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

3. Bei erfolgreicher Abarbeitung der Anfrage, sollte diese im Successhandler landen, wo die weitere Verarbeitung der Daten stattfinden 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 findet in einem separaten Thread statt (nicht UI Thread). Nimmt man Änderungen an dem User Interface vor, muss der Dispatcher verwendet werden.

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

5. Ist alles erfolgreich geladen, sollte das Datagrid wie folgt aussehen.

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

#Sharepoint 2010: Client object model & #Silverlight – ansynchroner Ansatz http://ow.ly/XAIk #fb
This comment was originally posted on Twitter

#Sharepoint 2010: Client object model & #Silverlight – synchroner Ansatz http://ow.ly/XAIw #fb
This comment was originally posted on Twitter

Kommentar hinterlassen


Pin It on Pinterest