2010-11-23 77 views
2

J'essaie d'accéder aux éléments d'une liste SharePoint 2010 à partir d'une partie Web personnalisée. Lorsque vous utilisez le thread, la propriété List.ItemCount est précise, mais la collection d'éléments est vide. Est-ce que quelqu'un a trouvé un moyen de contourner cela? Mon code pour accéder à la liste est ci-dessous:Est-il possible d'accéder à une liste SharePoint 2010 en utilisant le multi-thread dans un composant WebPart?

protected override void RenderContents(System.Web.UI.HtmlTextWriter writer) 
    { 
     Thread wThread = new Thread(new ThreadStart(WriteW)); 
     //only showing one thread for simplicity 
     wThread.Start(); 
     Thread.Sleep(500); 

     while (threadcount > 0) 
     { 
      Thread.Sleep(400); 
     } 
     lblGreeting.RenderControl(writer); 

    } 

    public void WriteW() 
    { 
     lock (lockobject) 
     { 
      threadcount++; 
     } 
     SPSite spsConflictSite = new SPSite("http://myserver/mysite"); 
     SPWeb spwConflictWeb = spsConflictSite.OpenWeb(); 
     SPList splConflictList = spwConflictWeb.Lists["Thread Tester List"]; 
     DataTable myTable = splConflictList.Items.GetDataTable(); 
      lblGreeting.Text += " " + myTable.Rows[0]["Title"].ToString(); 
      spsConflictSite.Dispose(); 
     lock (lockobject) 
     { 
      threadcount--; 
     } 
    } 
+0

Je ne peux pas dire pour positif et je voudrais entendre la réponse car j'ai un composant WebPart que je serais ravi de multithread. Cependant, vous avez des problèmes de concurrence dans le code que vous avez affiché. Pendant que vous verrouillez l'écriture de votre variable de membre 'threadcount' dans la méthode' WriteW', vous devriez faire la même chose avec la méthode 'RenderContents'. –

+0

De plus, bien que vous ayez correctement '' Dispose'' de 'spsConflictSite', vous devriez faire la même chose avec' spwConflictWeb' et 'myTable' car ils implémentent tous les deux' IDisposable'. –

+1

Merci pour les commentaires. C'est, pour la plupart, une version bonjour du vrai programme faite pour tester le problème d'accès à la liste. J'ai laissé tomber beaucoup pour la simplicité. – Starwfanatic

Répondre

0

Je pense que l'utilisation de Dispose dans le thread pourrait être un problème. Essayez d'encapsuler l'appel SPSite dans une instruction using pour donner à .net un certain contrôle sur la mise au rebut. J'ai eu multithreading dans SP2010 fonctionnant mais c'était un cochon et avait beaucoup de "dispositifs non planifiés".

J'ai eu un appel de support avec Microsoft ouvert à l'époque et leur réponse a été que cela devrait être possible mais n'était pas supporté.