2009-09-08 9 views
5

オブジェクトを処分することについてStefan Gossner's postを読んだ後、Cross method dispose patternsについてこの質問をしたところ、私は誤っていくつかのSPWebsを再開したという罪悪感を知りました。私はStefan Gossnerの投稿で、あなたが何らかの子オブジェクトを終えた後にSPWebを処分すべきだと言います。ただし、microsoft documentationにはSPListItemCollectionオブジェクトのキャッシュが含まれています。次のコードは正しいですか?返されたSPListItemCollectionはSPWebオブジェクトを再度開きますか?確かに言う方法はありますか?関数から返された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オブジェクト オブジェクトを配置する必要があり

このオブジェクトの子オブジェクトです。

私がSPAWebを処分した後にSPListItemCollectionを使用すると、SPWebが自動的に再開されるという彼の主張を信じています。私の知る限り答えはノーですが、私はあなたが(代理人)に沿ってメソッドを送信する必要があり、このメソッドを呼び出すために、これを行うことにより

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

のようなコードに何かを書いているだろうことを知っているよう

答えて

4

asking Stefan directlyの後に、SPListItemCollectionがSPWebを破棄した後にSPWebを再オープンできることが判明しました。これは、上記の投稿コードが不正確であることを意味し、SPListItemCollectionを使用した後でのみSPWebを処分することができます。

更新: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

SPListItemCollectionは、例えば使用する必要があります。

FetchItems(項目=> ....)またはFetchItems(DoStuffWithItems(SPListItemCollection))

+0

私はアクション<>を使用している可能性がありますが、アクションが変更されるとは思わない...私はアクション<>の目的を破ると思いますか?おそらく、GetListItems()関数内のSPListItemCollectionを使用してコードをすべて安全に移動する必要があります。 –

0

あなたが同じスコープにSPWebが必要かどうかについて話している場合あなたがSPListの使用に慣れたときItemCollection、私は答えがノーだと思います。例えば

、私は定期的に次のようにします。

private IEnumerable<SPListItem> AllItems; 

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

し、私はすべての場所でAllItemsを使用し、それが正常に動作します。

結果セットでLinqを使用できるように、キャストが実行されます。特に、データに対して複数の副選択を行っている場合は、リストにクエリを送信するよりはるかに高速です。

+0

残念ながら、私はVisual Studio 2005にしかアクセスできず、Linqを使用することはできません。私はSPListItemsを返すあなたの方法が好きです。しかし、私の質問はあなたがSPWebを必要としているかどうかではなく、別のものが自動的に開かれて処分されるかどうかです。 –

+0

ああ、私が知っている限り、いいえ、ひとたびあなたがすべて自己完結型のアイテムを手に入れると、誰も作成されません。 – Moo

+0

また、Linqを使用しない場合は、コレクションをSPListItemCollectionとして保存し、foreach(ListItemsのSPListItem MyItem){}ループを実行することができます – Moo

関連する問題