2009-09-08 10 views
5

वस्तुओं का निपटान करने के बारे में Stefan Gossner's post पढ़ने के बाद और Cross method dispose patterns के बारे में यह प्रश्न, मैंने पाया कि मैं कुछ एसपीडब्ल्यूबी को गलती से खोलने का दोषी था। मैं स्टीफन गॉसनर के पद में जानता हूं कि वह किसी भी बच्चे के ऑब्जेक्ट के समाप्त होने के बाद आपको एसपीवेब का निपटान करना चाहिए। हालांकि, microsoft documentation SPListItemCollection ऑब्जेक्ट को कैशिंग का उल्लेख करता है। क्या निम्न कोड सही है? क्या वापस आए SPListItemCollection एक SPWeb ऑब्जेक्ट को फिर से खोल देगा? निश्चित रूप से बताने का कोई तरीका है?एसपीवेब को फिर से खोलने के लिए एक एसपीएलआईटीआईटेम कोलेक्शन का उपयोग करना होगा?

// is this correct???? 
private SPListItemCollection GetListItems() 
{ 
    SPListItemCollection items = null; 
    try 
    { 
     using (SPSite site = new SPSite(GetListSiteUrl())) 
     { 
      using (SPWeb web = site.OpenWeb()) 
      { 
       // retrieve the list 
       SPList list = web.Lists[_ListName]; 

       // more code to create the query... 
       items = list.GetItems(query); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     // log error 
    } 
    return items; 
} 

संपादित 09/09/09

मैं मुख्य रूप से Stefan Grossner's post के इस हिस्से की बात कर रहा हूँ:

तुम एक करने के लिए पिछले पहुँच के बाद एक SPWeb या SPSite वस्तु निपटाने चाहिए इस ऑब्जेक्ट का बाल ऑब्जेक्ट।

मेरा मानना ​​है कि वह क्या कह रहा है कि अगर मैं SPListItemCollection का उपयोग मैं SPWeb है कि मैं इसे पाने के लिए इस्तेमाल किया के निपटान के बाद ... SPWeb स्वचालित रूप से फिर से खोल दिया जाएगा।

उत्तर

4

मुझे asking Stefan directly के बाद पता चला कि SPListItemCollection वास्तव में एसपीवेब को फिर से खोलने के बाद फिर से खोल सकता है। इसका मतलब है कि ऊपर पोस्ट किया गया मेरा कोड असंगत है और मैं SPListItemCollection का उपयोग करने के बाद केवल एसपीवेब का निपटान करने में सक्षम हूं।

अद्यतन: SPListItemCollection में कुछ और करने के लिए परिवर्तित करना बेहतर है और इसके बदले में वापस जाना बेहतर है।

private DataTable GetListItems() 
{ 
    DataTable table = null; 
    try 
    { 
     SPListItemCollection items = null; 
     using (SPSite site = new SPSite(GetListSiteUrl())) 
     { 
      using (SPWeb web = site.OpenWeb()) 
      { 
       // retrieve the list 
       SPList list = web.Lists[_ListName]; 

       // more code to create the query... 
       items = list.GetItems(query); 

       // convert to a regular DataTable 
       table = items.GetDataTable(); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     // log error 
    } 
    return table; 
} 
1

जहाँ तक मुझे पता जवाब नहीं है, लेकिन मैं की तरह

private void FetchItems(Action<SPListItemCollection> action) 
{ 
    using(...) 
    { 
     var items = list.GetItems(query); 
     action(items); 
    } 
} 

कोड कुछ लिखा है | ऐसा करने से के रूप में, इस विधि कॉल करने के लिए आप (प्रतिनिधि) के साथ एक विधि को भेजने की जरूरत है कि SPListItemCollection, एक उदाहरण के लिए इस्तेमाल किया जाना चाहिए:

FetchItems (आइटम => ....) या FetchItems (DoStuffWithItems (SPListItemCollection))

+0

मैं शायद इसे क्रिया का उपयोग करके कर सकता हूं <> लेकिन मुझे नहीं लगता कि कार्रवाई कभी भी बदलेगी ... मुझे लगता है कि कार्रवाई के उद्देश्य को हराता है <>? मुझे बस सुरक्षित होने के लिए GetListItems() फ़ंक्शन के अंदर SPListItemCollection का उपयोग करके सभी कोड को स्थानांतरित करने की आवश्यकता है। –

0

आप के बारे में आप एक ही दायरे में एक SPWeb की जरूरत है कि क्या बात कर रहे हैं, तो जब आप एसपीएलिस्ट का उपयोग करने के लिए चारों ओर मिलता है आइटम चयन, मुझे लगता है कि जवाब नहीं है।

उदाहरण के लिए, मैं नियमित रूप से निम्न कार्य करें:

private IEnumerable<SPListItem> AllItems; 

    public void GetItems() 
    { 
     var results = SPContext.Current.Web.Lists[ListName].Items.Cast<SPListItem>(); 
     this.AllItems = results; 
    } 

और उसके बाद मैं हर जगह AllItems उपयोग करते हैं, और यह ठीक काम करता है।

यदि आप सोच रहे हैं, तो कास्ट किया जाता है, इसलिए मैं परिणाम सेट पर लिंक का उपयोग कर सकता हूं - सूची में एक प्रश्न सबमिट करने से बहुत तेज़, खासकर यदि आप डेटा पर एकाधिक उप-चयन कर रहे हैं।

+0

दुर्भाग्यवश, मेरे पास केवल विजुअल स्टूडियो 2005 तक पहुंच है और मुझे नहीं लगता कि मैं लिंक का उपयोग करने में सक्षम हूं। मैं SPListItems को वापस करने की आपकी विधि की तरह करता हूं।हालांकि, मेरा सवाल यह नहीं है कि आपको एसपीवेब की आवश्यकता है, लेकिन क्या कोई दूसरा स्वचालित रूप से खोला जाएगा जिसे निपटान करने की आवश्यकता होगी। –

+0

आह, जहां तक ​​मुझे पता है, नहीं, एक बार ऐसा नहीं होता है जब आप आइटम प्राप्त कर लेते हैं, वे सभी स्वयं निहित होते हैं। – Moo

+0

इसके अलावा, यदि आप लिंक का उपयोग नहीं करेंगे, तो आप संग्रह को एसपीएलिस्टइटेम कोलेक्शन के रूप में संग्रहीत कर सकते हैं और उन पर एक foreach (SPListItem MyItem ListItems) {} लूप पर – Moo