2013-05-02 40 views
1

我有一些代碼:處置資源的lambda

 
using(var userlookup = new UserLookup()) 
{ 
    someThing = someCollection 
        .Select(t => 
        { 
         var user = userLookup.UserLookup(t.UserId); 
         return new Wrapper 
         { 
          UserString = string.Format("{0} {1} ({2})", 
              user.FirstName, user.LastName, t.UserId), 
          SomeOtherProperty = t.SomeFunction() 
          etc.. 
         }; 
        }); 
} 

someThing訪問我得到一個ObjectDisposedException。這可以通過刪除使用塊來解決。如果我這樣做:

  1. UserLookup配置Linq枚舉時?
  2. 如果是這樣如何發生?
  3. 有沒有什麼辦法重新構造這段代碼來處置UserLookup實例,當枚舉被拋棄時仍然保持延期執行?

(我敢肯定,我可以調用ToList()的使用塊中,它會很好地工作,我可能會做,但只是好奇的緣故)

我還要提到的是someThing是MVC視圖模型上的屬性。

回答

1

有沒有什麼辦法來重新構造這段代碼來處置UserLookup實例,當枚舉被拋棄時仍然保持延遲執行?

您需要將UserLookup實例傳遞給生成此序列的方法,並在處理完結果後處理它。

(我敢肯定,我可以調用ToList()的使用塊中,它會很好地工作,我可能會做,但只是好奇的緣故)

是的,這會導致該枚舉將在UserLookup處置之前完全執行,並避免該問題。

+0

所以爲了保持defferred執行,我必須將foreach包裝在using塊中,並將該屬性轉換爲一個將UserLookup作爲參數的方法。說得通。謝謝! – Iain 2013-05-02 23:44:46