2009-09-21 1 views
0

Я с помощью объектной модели SharePoint с помощью консольного приложения на том же сервере, что и установки SharePoint, и, используя следующий код:Необъяснимая задержка при назначении строку в поле 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(); 
} 

Я получаю несколько секунд паузы между «Присвоение значения титула» и «Назначенное значение названия».

Когда я развертываю код как веб-часть, ее мгновенная, задержка возникает только тогда, когда код развертывается в качестве консольного приложения.

Редактировать: Дополнительная информация! Когда у меня назначено более одного поля, его всегда первое медленное, все последующие назначения выполняются так быстро, как ожидалось. Если я переключаю порядок полей вокруг, это не влияет на задержку - первое поле всегда медленное.

Любые мысли?

ответ

5

Похоже, это потому, что вы не получаете доступ к каким-либо полям перед использованием установщика. Если вы сначала прочтете хотя бы одно поле, вы, вероятно, увидите небольшую задержку и не задержите на сеттере, потому что под капотом SetValue() звонит EnsureFieldCollection(), который - если поля для элемента списка еще не заполнены - должен вернуться к коллекции полей SPList.

Кроме того, это не в вашем фрагменте кода, но убедитесь, что вы удаляете свои объекты SPWeb и SPSite, когда закончите. Хороший шаблон должен использовать using:

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

Это может быть разница между версиями Release и Debug, или тем фактом, что у этого есть отладчик attatched. Попробуйте перейти на сборку Release, и если это не сработает, попробуйте запустить его без отладчика (Ctrl + F5 в Visual Studio)

+0

Работа без отладчика не имеет никакого эффекта, такая же задержка возникает. – Moo

0

Прежде всего, я бы предложил сделать использование

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

Вы можете проверить EnsureFieldCollection, читая все поля элемента перед обновлением поля. Если после этого ваше первое поле будет обновлено мгновенно, вы можете быть уверены, что это причина.

+1

@KoenVosters: Я уверен, что вам не нужно читать все поля, достаточно одного. –

Смежные вопросы