Необъяснимая задержка при назначении строки полю SPListItem - PullRequest
0 голосов
/ 21 сентября 2009

Я использую объектную модель SharePoint через консольное приложение на том же сервере, что и установка SharePoint, и использую следующий код:

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();
}

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

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

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

Есть мысли?

Ответы [ 3 ]

5 голосов
/ 21 сентября 2009

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

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

using(SPSite site = new SPSite("url"))
{
    using(SPWeb web = site.OpenWeb())
    {
        //do stuff
    }
}
0 голосов
/ 21 сентября 2009

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

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

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

0 голосов
/ 21 сентября 2009

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

...