我通过与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();
}
我在“分配标题值”和“指定标题值”之间暂停了几秒钟。
当我将代码部署为Web部件时,它的瞬间延迟似乎只是在将代码部署为控制台应用程序时。
编辑:更多信息!当我分配了多个字段时,其总是第一个字段很慢,任何后续分配都与预期的一样快。如果我切换字段的顺序,它对延迟没有影响 - 第一个字段总是很慢。
有什么想法吗?
答案 0 :(得分:5)
看起来这是因为在使用setter之前你没有访问任何字段。如果您首先阅读至少一个字段,那么您可能会看到稍微延迟,并且设置器没有延迟,因为在SetValue()
调用EnsureFieldCollection()
,如果列表的字段项目尚未填充 - 必须回到SPList
的字段集合。
此外,这不在您的代码段中,但请确保在完成后处理SPWeb
和SPSite
个对象。一个好的模式是使用using
:
using(SPSite site = new SPSite("url"))
{
using(SPWeb web = site.OpenWeb())
{
//do stuff
}
}
答案 1 :(得分:0)
首先,我建议使用
using (SPSite MySite = new SPSite("http://server/"))
{
using (SPWeb MyWeb = MySite.OpenWeb())
{
//do your stuff here
}
}
您可以在更新字段之前通过阅读项目的所有字段来检查EnsureFieldCollection。如果之后您的第一个字段立即更新,您可以非常肯定这就是原因。
答案 2 :(得分:-1)
它可能是Release和Debug版本之间的区别,也可能是调试器附带的事实。尝试更改为发布版本,如果不起作用,请尝试在没有调试器的情况下运行它(在Visual Studio中为Ctrl + F5)