【问题标题】:Disposing resource in Linq statement lambdas在 Linq 语句 lambdas 中处理资源
【发布时间】:2013-05-03 07:36:33
【问题描述】:

我有一些代码:

使用(var userlookup = new UserLookup()) { someThing = someCollection .选择(t => { var user = userLookup.UserLookup(t.UserId); 返回新包装器 { UserString = string.Format("{0} {1} ({2})", user.FirstName, user.LastName, t.UserId), SomeOtherProperty = t.SomeFunction() ETC.. }; }); }

当访问someThing 时,我得到一个ObjectDisposedException。这可以通过删除 using 块来解决。如果我这样做:

  1. UserLookup 会在 Linq 枚举被释放时被释放吗?
  2. 如果是这样,这是怎么发生的?
  3. 是否有任何方法可以重新构造此代码以在释放可枚举时释放 UserLookup 实例,同时仍保持延迟执行?

(我确定我可以在 using 块中调用 ToList() 并且它会正常工作,我可能会这样做,但只是出于好奇)

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

【问题讨论】:

    标签: c# linq lambda idisposable


    【解决方案1】:

    是否有任何方法可以重新构造此代码以在释放可枚举时释放 UserLookup 实例,同时仍保持延迟执行?

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

    (我确定我可以在 using 块中调用 ToList() 并且它会正常工作,我可能会这样做,但只是出于好奇)

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

    【讨论】:

    • 因此,为了保持延迟执行,我实际上必须将 foreach 包装在 using 块中,并将属性转换为以 UserLookup 作为参数的方法。说得通。谢谢!
    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2013-03-13
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多