将字符串分配给SPListItem字段时出现无法解释的延迟

时间:2009-09-21 13:36:13

标签: c# .net sharepoint sharepoint-2007 wss

我通过与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部件时,它的瞬间延迟似乎只是在将代码部署为控制台应用程序时。

编辑:更多信息!当我分配了多个字段时,其总是第一个字段很慢,任何后续分配都与预期的一样快。如果我切换字段的顺序,它对延迟没有影响 - 第一个字段总是很慢。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

看起来这是因为在使用setter之前你没有访问任何字段。如果您首先阅读至少一个字段,那么您可能会看到稍微延迟,并且设置器没有延迟,因为在SetValue()调用EnsureFieldCollection(),如果列表的字段项目尚未填充 - 必须回到SPList的字段集合。

此外,这不在您的代码段中,但请确保在完成后处理SPWebSPSite个对象。一个好的模式是使用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)