Tag: idisposable

滥用IDisposable是否受益于“使用”被认为有害的陈述?

接口IDisposable的目的是以有序的方式释放非托管资源。 它与using关键字一起using ,该关键字在有问题的资源被处理之后定义范围。 因为这个meachnism是如此简洁,我一直试图让类实现IDisposable ,以便能够以不适合的方式滥用这种机制。 例如,可以实现类来处理嵌套的上下文,如下所示: class Context : IDisposable { // Put a new context onto the stack public static void PushContext() { … } // Remove the topmost context from the stack private static void PopContext() { … } // Retrieve the topmost context public static Context CurrentContext { get { … } […]

GC和IDispose如何在C#中工作?

我记得我是通过将它从网络直接流式传输到位图来加载图像。 关闭流,返回位图并将其保存在图像控件中。 我除了当我执行= loadPicture()时,第一个位图将被释放,就像智能​​指针在C ++中一样。 但它没有,我消耗了大量的公羊,直到我打电话给处理。 所以我的问题是。 GC和Dispose能够如何在C#中工作? 为什么它不像smart_ptr那样实现?

Linq to SQL存储库应该实现IDisposable

在过去的几天里,我一直在用Linq搜索关于存储库模式的信息。 那里有很多信息,但它经常是矛盾的,我仍然在寻找一个明确的来源。 我仍然不确定的一件事是存储库是否应该实例化它自己的DataContext并使用SubmitChanges方法,或者是否应该注入DataContext并在外部处理提交。 我已经看过这两个设计,但对推理没有真正的评论。 无论如何,以下模式很常见 class Repository { DataContext db = new LinqDataContext(); public IEnumerable GetAll() { … } public T GetById() { … } … etc public void SubmitChanges() { … } } 所以我的主要问题是,通过上面的实现,为什么存储库不需要实现IDisposable? 我已经看到上面几百个例子,并且它们似乎都没有打扰处理DataContext。 这不是内存泄漏吗?

仅仅为Owned 在我的项目中引用Autofac是不好的设计?

我最近成为了Autofac的OwnedInstancesfunction的重要用户。 例如,我用它来提供一个工厂来为我的数据库创建一个工作单元,这意味着我依赖于UnitOfWork工厂的类要求类型的对象: Func<Owned> 这非常有用 – 非常适合将IDisposable保留在我的界面之外 – 但它需要付出代价:因为Owned 是Autofac程序集的一部分,我必须在我知道Owned 的每个项目中引用Autofac。 ,并在每个代码文件中添加“使用Autofac.Features.OwnedInstances”。 Func 具有内置于.NET框架的巨大好处,因此我毫不怀疑将Func用作通用工厂包装器是可以的。 但是Owned 在Autofac程序集中,每次我使用它时,我都会创建一个对Autofac的硬引用(即使我在接口方法参数中对Autofac的唯一引用是Owned 类型)。 我的问题是:这是件坏事吗? 这会开始以某种方式让我回头,我还没有考虑到这一点吗? 有时我会有一个由许多其他项目引用的项目,因此我自然需要将其依赖关系尽可能接近零; 我是通过将Func >(实际上是数据库事务提供程序)传递给这些接口中的方法(否则将是autofac-nonnostic)来做恶的? 也许如果Owned 是一个内置的.NET类型,这整个困境会消失吗? (我是否应该屏住呼吸?)

我是否应该打扰处理共享进程生命周期的对象?

我知道实现IDisposable所有对象应该在不再需要时立即处理,以释放其非托管资源使用的内存。 我的问题涉及我知道的事实,直到主机进程本身终止为止。 如果我处理它们会不会有任何区别? 当进程死亡时,是否存在释放内存的可能性? GDI对象怎么样? 即使没有处理过程,GDI句柄是否会在进程终止时被释放? 我完全明白,无论如何处理所有物体都是一种好习惯。 纯粹是出于好奇而问我。

ClientBase不实现IDisposable成员

如果Dispose()方法声明不可见/声明,System.ServiceModel.ClientBase抽象类如何实现IDisposable接口? 如果我尝试做同样的事我得到一个错误,无法编译 abstract class ATeste : IDisposable { } ‘ATeste’没有实现接口成员’System.IDisposable.Dispose()’ 我正在使用VS 2010和Framework 4.0。 检查ClientBase声明: // Summary: // Provides the base implementation used to create Windows Communication Foundation // (WCF) client objects that can call services. // // Type parameters: // TChannel: // The channel to be used to connect to the service. public abstract class […]

在使用C#中返回用于使用的变量

我正在使用using语句中的using语句返回我正在创建的变量(听起来很有趣): public DataTable foo () { using (DataTable properties = new DataTable()) { // do something return properties; } } 这将Dispose属性变量?? 这样做后仍然得到这个警告: 警告34 CA2000:Microsoft.Reliability:在方法’test.test’中,在对所有引用超出范围之前,在对象’properties’上调用System.IDisposable.Dispose。 有任何想法吗? 谢谢

IDisposable实现 – ‘if(disposing)’应该包含什么

我一直在winforms应用程序中修复一些内存泄漏问题,并注意到一些非显式处置的一次性对象(开发人员没有调用Dispose方法)。 Finalize方法的实现也没有用,因为它没有进入if (disposing)子句。 所有静态事件取消注册和收集清除都已放入if (disposing)子句中。 如果对象是一次性的,最好的做法就是调用Dispose,但不幸的是,有时会发生这种情况 如果存在非托管对象,静态事件处理程序和一些需要在处置时清除的托管集合。 什么是决定什么应该进入的方式以及if (disposing)条款应该采用什么方式。 处理方法。 // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user’s code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by […]

如何正确管理DataContext的处理?

我有一个非常重的数据库访问的Web服务。 它在测试中运行良好,但是一旦我将它投入生产并加速加载,它就会开始产生在DataContext中调用某个方法时引发的错误。 错误通常是以下之一: 你调用的对象是空的 无法访问已处置的对象。 对象名:’Dispose后访问的DataContext。’。 但不总是。 任何单个Web服务请求都可能导致多达10或15个数据库查询以及1或2个更新。 我设计了一个带有数据访问层的应用程序,这是一组对象,表示我的数据库中包含所有业务逻辑的表。 这是我的Web服务的一个单独项目,因为它与Web GUI共享。 数据访问对象派生自一个基类,该基类具有GetDataContext()方法,可在需要时启动数据上下文的实例。 我写的所有数据访问对象都是: using (db = GetDataContext()) { // do some stuff } 为每个数据库交互愉快地创建/使用/处置我的DataContext(由sqlmetal.exe创建)对象。 经过几个小时的搔抓,我想我已经确定我的错误的原因是在加载时datacontext对象被创建和处理的方式太多了,我需要更改东西以共享相同的datacontext持续时间Web服务请求。 我发现这篇文章在互联网上有一个DataContextFactory,似乎完全符合我的需要。 但是,现在我已经实现了这个,并且DataContext被保存为HttpContext中的一个项目,我得到… 无法访问已处置的对象。 对象名:’Dispose后访问的DataContext。’ …每当我的datacontext被多次使用时。 这是因为我的use using (…) {}代码在首次使用后处理我的datacontext。 所以,我的问题是……在我浏览整个数据访问层并删除大量使用usings ,这样做的正确方法是什么? 我不想通过取出使用来导致内存泄漏,但同时我想在不同的数据访问对象之间共享我的datacontext。 我应该只是删除使用,并在我从Web服务请求返回之前手动调用dispose方法吗? 如果是这样,我怎么去确保我捕捉到所有的东西,记住我有几个可能变得凌乱的try-catch块。 还有另一种更好的方法吗? 我应该忘记处理并希望一切都被隐瞒了吗? UPDATE 问题似乎不是性能问题……请求处理非常快,不超过200毫秒。 事实上,我已经通过生成大量虚假请求进行负载测试而没有任何问题。 据我所知,它与负载有关的原因有两个: 大量请求会导致并发请求相互影响 问题更频繁地发生,因为有很多请求。 当问题确实发生时,应用程序池将进入错误状态,并需要循环才能使其再次运行。

有效关闭WCF 4通道的正确方法

我使用以下方法关闭WCF 4通道。 这是正确的方法吗? using (IService channel = CustomChannelFactory.CreateConfigurationChannel()) { channel.Open(); //do stuff }// channels disposes off??