Startseite > Techblog > Microsoft Sharepoint > Sharepoint 2010: Client object model & Silverlight...
thu

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.

Kommentar Feed Trackback URL
3 Antworten zu:
“Sharepoint 2010: Client object model & Silverlight – asynchroner Ansatz”
  1. aseantic sagt:

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

  2. aseantic sagt:

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

  3. [...] 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 [...]

Hinterlassen Sie einen Kommentar

Tag Cloud

Unsere Themen

Kommentare

  • Niels Jaeckel: Hallo Ralf, wir haben heute das Benno auf die Version 1.1.3 aktualisiert. Dort funktioniert die...
  • Patrick: Super und Vielen Dank für diesen Artikel!! War genau das, was ich gesucht habe und hat mir sehr geholfen
  • hanjo: whileprintingrecords; {Gruppierfeld}=Previous({Grupp ierfeld}) Gruppierfeld natürlich. Bug im Editor, hat die...
  • hanjo: Bedingte Unterdrückung Detailbereich wie beschrieben. Bedingte Unterdrückung Gruppenkopf 1b:...
  • Niels Jaeckel: Hallo Ralf, wir haben es noch nicht mit dieser Benno-Version getestet. Allerdings steht das Update auf...

Twitter