2009-09-21 74 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(); 
} 

我得到一個「分配標題值」和「分配標題值」之間的幾秒鐘暫停。

當我將代碼作爲Web部件進行部署時,它的即時狀態似乎只是當代碼部署爲控制檯應用程序時。

編輯:更多信息!當我分配了多個字段時,其始終是第一個較慢的字段,所有後續分配的速度都與預期的一樣快。如果我切換字段的順序,它對延遲沒有影響 - 第一個字段總是很慢。

有什麼想法?

回答

5

看起來這是因爲您在使用setter之前沒有訪問任何字段。如果您至少先讀了一個字段,那麼您可能會在那裏看到稍微的延遲,並且無需延遲,因爲引擎SetValue()調用了EnsureFieldCollection(),如果列表項的字段尚未填充,必須檢查回SPList的字段集合。

另外,這不在您的代碼片段中,但確保在完成後處理您的SPWebSPSite對象。一個好的模式是使用using

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

它可能是版本和調試版本之間的區別,或者它具有調試器的事實。嘗試更改爲發佈版本,如果不起作用,請嘗試在沒有調試器的情況下運行它(在Visual Studio中按Ctrl + F5)

+0

沒有調試器的情況下運行完全沒有影響,同樣的延遲經歷。 – Moo 2009-09-21 13:52:43

0

首先,我會建議利用的

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

您可以通過更新前場讀該項目的所有領域檢查EnsureFieldCollection。如果之後你的第一個領域立即更新,你可以確信這就是原因。

+1

@KoenVosters:我很肯定你不需要閱讀所有的字段,只需要一個就足夠了。 – 2009-09-21 15:14:59