2009-09-21 7 views
0

J'utilise le modèle d'objet SharePoint via une application de la console sur le même serveur que l'installation de SharePoint, et en utilisant le code suivant:retard inexpliqué lors de l'attribution d'une chaîne à un champ de SPListItem

SPSite MySite = new SPSite("http://server/"); 
SPWeb MyWeb = MySite.OpenWeb(); 
MyWeb.AllowUnsafeUpdates = true; 
SPList MyList = MyWeb.Lists["Test"]; 

const string EmptyQuery = "0"; 
SPQuery q = new SPQuery { Query = EmptyQuery }; 

String Source = "Test String"; 

for(int i = 1; i < 1000; i++) 
{ 
    Console.WriteLine("Creating new item"); 

    SPListItem MyItem = MyList.GetItems(q).Add(); 

    Console.WriteLine("Created new item"); 

    Console.WriteLine("Assigning Title Value"); 

    MyItem["Title"] = Source.ToString(); 

    Console.WriteLine("Assigned Title Value"); 

    MyItem.Update(); 
} 

Je reçois un plusieurs secondes de pause entre "Affectation de la valeur du titre" et "Valeur du titre affecté".

Lorsque je déploie le code en tant que composant WebPart, son instantané, le retard ne semble être que lorsque le code est déployé en tant qu'application de console.

Editer: Plus d'informations! Lorsque j'ai plus d'un champ affecté, son toujours le premier champ qui est lent, toutes les affectations suivantes sont aussi rapides que prévu. Si je change l'ordre des champs, cela n'a aucun effet sur le délai - le premier champ est toujours lent.

Des pensées?

Répondre

5

Cela semble dû au fait que vous n'accédez à aucun champ avant d'utiliser le setter. Si vous lisez au moins un champ en premier, vous verrez probablement un léger retard, et aucun retard sur le setter, parce que sous le capot, SetValue() appelle , qui - si les champs de l'élément de la liste n'ont pas déjà été renseignés - doit revenir à la collection de champs SPList.

En outre, ce n'est pas dans votre extrait de code, mais assurez-vous de disposer de vos objets SPWeb et SPSite lorsque vous avez terminé. Un bon modèle est d'utiliser using:

using(SPSite site = new SPSite("url")) 
{ 
    using(SPWeb web = site.OpenWeb()) 
    { 
     //do stuff 
    } 
} 
-1

Il peut s'agir d'une différence entre les versions Release et Debug, ou du fait que le débogueur est attatché. Essayez de passer à une version Release, et si cela ne fonctionne pas essayez de l'exécuter sans le débogueur (Ctrl + F5 dans Visual Studio)

+0

L'exécution sans le débogueur n'a aucun effet, le même délai est rencontré. – Moo

0

Tout d'abord, je suggère faire usage de

using (SPSite MySite = new SPSite("http://server/")) 
{ 
    using (SPWeb MyWeb = MySite.OpenWeb()) 
    { 
     //do your stuff here 
    } 
} 

Vous pouvez vérifier la EnsureFieldCollection en lisant tous les champs de l'élément avant de mettre à jour le champ. Si après cela, votre premier champ est mis à jour instantanément, vous pouvez être sûr que c'est la raison.

+1

@KoenVosters: Je suis sûr que vous n'avez pas besoin de lire tous les champs, juste un devrait suffire. –

Questions connexes