Tag: idisposable

在C#中使用(IDisposable obj = new …)来编写流中的代码块(例如XML)

我已经开始使用实现IDisposable的类来使用using语句在流中编写块。 这有助于保持正确的嵌套并避免丢失或错误放置的开始/结束部件。 基本上,构造函数写入块的开头(例如打开XML标记),Dispose()结束(例如关闭XML标记)。 示例是下面的UsableXmlElement(它适用于大型XML,因此内存中的LINQ to XML或XmlDocument不是选项)。 但是,这些IDisposable不实现Microsoft推荐的复杂模式,使用Destructor / Finalizer,单独的Dispose(bool)方法和GC.SuppressFinalize()。 Dispose只是简单地写出end元素,就是这样。 这有什么不妥的,或者这是保持元素正确嵌套的好方法吗? class UsableXmlElement : IDisposable { private XmlWriter _xwriter; public UsableXmlElement(string name, XmlWriter xmlWriter) { _xwriter = xmlWriter; _xwriter.WriteStartElement(name); } public void WriteAttribute(string name, T value) { _xwriter.WriteStartAttribute(name); _xwriter.WriteValue(value); _xwriter.WriteEndAttribute(); } public void WriteValue(T value) { _xwriter.WriteValue(value); } public void Dispose() { _xwriter.WriteEndElement(); } } […]

async / await和IDisposable接口

我有一个实现IDisposable接口的类来处理私有变量_MailMessage同一个类有一个异步方法,它使用私有IDisposable变量,即async public Task Send我的问题是:正常的IDisposable实现是否会配置异步方法完成后的私有变量? 这是我正在谈论的课程的一个例子: public class Email : IEmail { private readonly IEmailData _EmailData; private MailMessage _MailMessage = new MailMessage(); public Email(IEmailData emailData) { if (emailData == null) { throw new ArgumentNullException(“emailData”); } if (String.IsNullOrEmpty(emailData.To)) { throw new ArgumentNullException(“emailData.To”); } if (String.IsNullOrEmpty(emailData.From)) { throw new ArgumentNullException(“emailData.From”); } if (String.IsNullOrEmpty(emailData.FromName)) { throw new ArgumentNullException(“emailData.FromName”); } […]

为什么要部署StreamReader会使流不可读?

我需要从开始到结束两次读取一个流。 但是下面的代码抛出了ObjectDisposedException: Cannot access a closed fileexception。 string fileToReadPath = @””; using (FileStream fs = new FileStream(fileToReadPath, FileMode.Open)) { using (StreamReader reader = new StreamReader(fs)) { string text = reader.ReadToEnd(); Console.WriteLine(text); } fs.Seek(0, SeekOrigin.Begin); // ObjectDisposedException thrown. using (StreamReader reader = new StreamReader(fs)) { string text = reader.ReadToEnd(); Console.WriteLine(text); } } 为什么会这样? 什么是真的处置? 为什么操纵StreamReader会以这种方式影响关联的流? 期望可以多次读取可搜索流是不合逻辑的,包括几个StreamReader […]

编写我们自己的Dispose方法而不是使用Idisposable

经过很多Idisposable的文章后,我对它的用法感到困惑。 所有文章都解释了它是什么以及如何实现。 如果我们没有,我想了解我们会想念的。 它是一个接口,其中包含一个方法Dispose()。 让我们举一个例子通常使用dispose显示为处理数据库连接。 代码就像 Public class Test:Idisposable { public Test() { DatabaseConnection databaseConnection = new DatabaseConnection(); } public void Dispose() { if (this.databaseConnection != null) { this.databaseConnection.Dispose(); this.databaseConnection = null; } } } 虽然dispose实现了但是在dispose方法中,databaseconnection的dispose属性用来释放连接(this.databaseConnection.Dispose();) 我的问题是为什么在这种情况下我们需要实现IDisposable? 我们可以直接调用this.databaseConnection.Dispose()并释放连接。 为什么在内部实现dispose也调用对象的dispose属性。 作为Idisposable方法的替代方案,我们可以实现释放方法以释放内存。 Public Class Test { public Test() { DatabaseConnection databaseConnection = new DatabaseConnection(); } public void […]

使用块使用块

可能重复: 如果我不在我的C#控制台应用程序中关闭System.Diagnostics.Process会发生什么? 由于System.Diagnostics.Processinheritance自实现IDisposable Component ,我是否应该始终using块创建Process ? 例如,这……: using (var process = new Process()) { process.StartInfo.FileName = “some process.exe”; process.Start(); process.WaitForExit(); } ……而不是这个: var process = new Process { StartInfo = { FileName = “some process.exe” } }; process.Start(); process.WaitForExit(); 我问,因为我很少看到Process出现在using块中; 例如, Process的MSDN页面不使用它。 使用对象初始化程序也很有帮助。 如果我应该使用它,那么我应该去“改造”它到我现有的代码库吗? 如果没有这样做会有什么后果? (假设在每种情况下都正确调用WaitForExit() 。)

清理Crystal Reports ReportDocument对象使用的资源的最佳方法是什么?

我正在开发一个使用Crystal Reports进行报告的应用程序。 它在ReportDocument对象中打开一个给定的报告,完成它需要做的事情然后关闭报告。 using (var report = OpenReport(reportSourceInfo)) { // Do stuff with the report report.Close(); } OpenReport方法对源文件进行一些validation,并返回一个打开的ReportDocument对象。 测试表明,此代码完成了它的意图并且似乎没有任何问题。 我真正建议的问题是当我进行报告项目的代码分析(CA)构建时,我得到以下CA消息: CA2202:Microsoft.Usage:对象’report’可以在方法’CrystalReportingProvider.ReportExecute(ReportSourceInformation)’中多次处理。 为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose。 现在显然我可以改变代码,所以我没有得到这个CA警告,但我的问题是我应该吗? Crystal Reports ReportDocument.Close()方法是否可以正确处理资源清理? 该消息似乎表明Close方法调用Dispose方法,但这似乎不正确。 任何意见,将不胜感激。

从’using’块中调用’return’时会发生什么?

如果我有一个像这样的使用块的方法… public IEnumerable GetPersons() { using (var context = new linqAssignmentsDataContext()) { return context.Persons.Where(p => p.LastName.Contans(“dahl”)); } } …从using块中返回值,IDisposable对象是否仍然处理?

我是否需要配置SemaphoreSlim

根据文件: “ SemaphoreSlim不使用Windows内核信号量”。 是否有SemaphoreSlim使用的特殊资源,当不再使用SemaphoreSlim时调用Dispose很重要?

单身人士与终结者但不是IDisposable

这就是我对“CLR via C#”,“Effective C#”和其他资源中的IDisposable和终结器的理解: IDisposable用于确定性地清理托管和非托管资源。 负责非托管资源的类(例如文件句柄)应该实现IDisposable并提供终结器以保证它们被清除,即使客户端代码没有在实例上调用Dispose()。 仅负责托管资源的类永远不应实现终结器。 如果你有一个终结器,那么你必须实现IDisposable(这允许客户端代码做正确的事情并调用Dispose(),而终结器可以防止泄漏资源,如果他们忘记)。 虽然我理解并同意上述所有内容,但有一种情况我认为打破这些规则是有意义的:负责非托管资源的单例类(例如提供对特定文件的单点访问) )。 我认为在单例上使用Dispose()方法总是错误的,因为单例实例应该在应用程序的生命周期中存在,如果任何客户端代码调用Dispose(),那么你就被填充了。 但是,您需要一个终结器,以便在卸载应用程序时终结器可以清理非托管资源。 因此,在我看来,使用没有实现IDisposable的终结器的单例类似乎是一件合理的事情,但这种类型的设计与我所理解的最佳实践相反。 这是一种合理的方法吗? 如果没有,为什么不呢?什么是优越的选择?

我应该如何处理Dispose()方法中的exception?

我想提供一个类来管理创建和随后删除临时目录。 理想情况下,我希望它可以在using块中使用,以确保无论我们如何离开块,都会再次删除目录: static void DoSomethingThatNeedsATemporaryDirectory() { using (var tempDir = new TemporaryDirectory()) { // Use the directory here… File.WriteAllText(Path.Combine(tempDir.Path, “example.txt”), “foo\nbar\nbaz\n”); // … if (SomeCondition) { return; } if (SomethingIsWrong) { throw new Exception(“This is an example of something going wrong.”); } } // Regardless of whether we leave the using block via the return, […]