在Linq语句lambdas中处理资源

时间:2013-05-02 23:29:29

标签: c# linq lambda idisposable

我有一些代码:

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. 当Linq可枚举被处理时,UserLookup会被处理吗?
  2. 如果是这样,这是怎么发生的?
  3. 有没有办法重新构造此代码,以便在处理可枚举的同时处理UserLookup实例,同时仍然保持延迟执行?
  4. (我确定我可以在使用区域内调用ToList()并且它可以正常工作,我可能会这样做,但仅仅是为了好奇心)

    我还应该提到someThing是MVC视图模型的属性。

1 个答案:

答案 0 :(得分:1)

  

有没有办法重新构造此代码,以便在仍然保持延迟执行的同时处置枚举时处置UserLookup实例?

您需要将UserLookup实例传递给生成此序列的方法,并在完成处理结果后将其丢弃。

  

(我确定我可以在使用区域内调用ToList()并且它可以正常工作,我可能会这样做,但仅仅是为了好奇心)

是的,这会导致在放置UserLookup之前完全执行可枚举,并避免问题。