2013-05-02 51 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