Tag: idisposable

Dispose()或Finalize()是否应该用于删除临时文件?

我有一个类,它在活动时使用临时文件( Path.GetTempFileName() )。 我想确保在关闭程序后这些文件不会留在用户的硬盘上占用空间。 现在我的类有一个Close()方法,它检查该类使用的任何临时文件是否仍然存在并删除它们。 将此代码放在Dispose()或Finalize()方法中会更有意义吗?

将线程安全性添加到IDisposable对象的正确方法是什么?

想象一下IDisposable接口的实现,它有一些公共方法。 如果在多个线程之间共享该类型的实例并且其中一个线程可以处置它,那么确保其他线程在处置后不尝试使用该实例的最佳方法是什么? 在大多数情况下,在处理对象之后,其方法必须知道它并抛出ObjectDisposedException或者可能是InvalidOperationException或者至少通知调用代码做错了什么。 我是否需要为每种方法进行同步 – 尤其是在检查它是否被丢弃时? 使用其他公共方法的所有IDisposable实现是否需要是线程安全的? 这是一个例子: public class DummyDisposable : IDisposable { private bool _disposed = false; public void Dispose() { _disposed = true; // actual dispose logic } public void DoSomething() { // maybe synchronize around the if block? if (_disposed) { throw new ObjectDisposedException(“The current instance has been disposed!”); } // […]

我该如何inheritanceIDisposable?

class级名称已被更改以保护无辜者 。 如果我有一个名为ISomeInterface的接口。 我还有inheritance接口的类,FirstClass和SecondClass。 FirstClass使用必须处理的资源。 SecondClass没有。 所以问题是,我应该从IDisposableinheritance哪里? 以下两个选项似乎都不太理想: 1) 使FirstClassinheritanceIDisposable 。 然后,任何处理ISomeInterfaces的代码都必须知道是否要处理它们。 这闻起来像是与我紧密耦合。 2) 使ISomeInterfaceinheritanceIDisposable 。 然后,任何从它inheritance的类都必须实现IDisposable,即使没有任何东西可以处理。 除了注释之外,Dispose方法基本上是空白的。 #2对我来说似乎是正确的选择,但我想知道是否有其他选择。

C#条件使用块语句

我有以下代码,但它很尴尬。 我怎么能更好地构建它? 我是否必须使我的消费类实现IDisposable并有条件地构建网络访问类并在完成后处置它? protected void ValidateExportDirectoryExists() { if (useNetworkAccess) { using (new Core.NetworkAccess(username, password, domain)) { CheckExportDirectoryExists(); } } else { CheckExportDirectoryExists(); } }

在entity framework中处置对象上下文4

我有一个实体类,它是从我的数据库模型自动生成的。 该类inheritance了ObjectContext,它inheritance了IDisposable。 我创建了一个存储库,其中包含各种方法,这些方法使用实体对象的单个实例与数据库进行交互。 自动生成的类 public partial class DevEntities : ObjectContext { public const string ConnectionString = “name=DevEntities”; public const string ContainerName = “DevEntities”; 存储库类 DevEntities db = new DevEntities(); public Customer GetCustomerByID(int id) { var customers = db.Customers.FirstOrDefault(c => c.CustomerId == id); return customers; } public Customer GetCustomerByPasswordUsername(string email, string password) { var customers = […]

完成使用后,是否需要关闭.NET服务引用客户端

我试图找出在完成使用后关闭.net服务引用客户端是否有必要。 几乎我在网上遇到的所有例子似乎都没有,但生成的客户端实现了IDisposable,因为它确实打开了与服务的连接,我的直觉告诉我你需要关闭那个连接。完成它。 这是我从http://msdn.microsoft.com/en-us/library/bb386386(v=VS.90).aspx中提取的代码示例: private void button1_Click(System.Object sender, System.EventArgs e) { ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(); string returnString; returnString = client.GetData(textBox1.Text); label1.Text = returnString; } 我认为你至少应该在这个方法结束时调用client.Close(),最好还是在using语句中包装第一行。 我只是希望得到一些反馈,以找出最佳实践。

我如何说服我的同事不要在所有事情上实施IDisposable?

我正在开发一个项目,其中有大量的对象由一些类实例化,这些类在应用程序的生命周期内保留在内存中。 每次不时抛出OutOfMemoryExceptions都会导致大量内存泄漏。 似乎在实例化的对象之前超出范围之后,它们不会被垃圾收集。 我已经将问题分离为主要是关于附加到永远不会分离的长生命对象的事件处理程序,从而导致长生命对象仍然引用超出范围的对象,然后永远不会垃圾收集。 我的同事提出的解决方案如下:在所有类,全面和Dispose方法中实现IDisposable,使对象中的所有引用都为null,并从您附加到的所有事件中分离。 我相信这是一个非常糟糕的主意。 首先是因为它“过度杀伤”,因为问题可以通过修复一些问题区域来解决,其次因为IDisposable的目的是释放对象控制的任何非托管资源,而不是因为你不信任垃圾收集器。 到目前为止,我的论点都被置若罔闻。 我怎能说服他们这是徒劳的?

实现IDisposable C#

我在理解IDisposable界面时遇到了一些麻烦 我正在开发一个游戏引擎,并在我的解决方案上运行代码分析,并被告知在我的“GrapicsEngine”类上实现IDisposable接口,因为它包含一个Bitmap实例。 当然,我搜索了互联网,以了解如何正确地做到这一点,并提出了以下代码: 这是我的class级成员: private const int BITMAP_WIDTH = 4096; private const int BITMAP_HEIGHT = 4096; private Graphics backBuffer; private Bitmap bitmap; private Color clearColor; private WindowSurface surface; private GraphicsQuality quality; private Viewport viewport; 这是我的IDispoable地区: #region IDisposable public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing == true) ReleaseManagedResources(); […]

关于using语句的一些高级问题

我知道这里有很多关于如何使用using语句并调用Dispose()方法的线程。 我已经阅读了大部分这些主题。 如果我调用Dispose(),它会调用Close()吗? 如果我想使用一个对象(比如SqlDataReader),然后在另一个代码块中再次使用它,我应该不调用Dispose()吗? 这也意味着省略using语句。 另外,为了澄清一下,如果FileStream正在包装StreamWriter并且我在FileStream上调用dispose,这将调用Flush(),Close()和Dispose()(取决于Dispose()是否在StreamWriter上调用Close()),对? 同样,如果我在FileStream上调用Close,这将只调用FileStream上的Flush()和Close()。 检查IL是一个很好的方式来回答这些关于幕后发生的事情的问题吗?

IDisposable.Dispose在使用块中的exception后永远不会被调用

我从许多这样的来源了解到,如果在Using块中抛出exception,将始终调用IDisposable的Dispose方法。 那么我有这个代码: static class MainEntryPoint { static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += HandleUnhandledException; using (var x = new Disposable()) { throw new Exception(“asdfsdf”); } } private static void HandleUnhandledException(Object sender, System.UnhandledExceptionEventArgs e) { Environment.Exit(0); } } class Disposable : IDisposable { public void Dispose() { System.Diagnostics.Debug.Print(“I am disposed”); } } 当抛出未处理的exception时,它退出应用程序。 永远不会调用Dispose方法。 为什么?