我应该在单例上实现 IDisposable 吗?

2023-11-27

我有一个 Windows 服务,其中包含一个单例,该单例又使用一些记录器、消息队列侦听器等。这些类实现了IDisposable。我应该实施IDisposable在单例本身中还是做其他事情来确保服务停止/崩溃后,本机资源一切正常? 单例是这样实现的:

public class Temp
{
   private static readonly Lazy<Temp> instance = new Lazy<Temp>(() => new Temp());

   private Temp()
   {
      // create IDisposable objects which use native resources
   }

   public static Temp Instance
   {
      get
      {
         return instance.Value;
      }
   }
} 

我宁愿不执行 IDisposable在单例上:IDisposable provokes开发商至Dispose(单个)实例:

  using(var temp = Temp.Instance) {
    ...
  }

这导致(可能)crash in 应用程序的其他部分(由于单Temp实例已被处置):

  Temp.Instance.SomeFucntion(); // <- possible fail, since Temp.Instanceis disposed

在极少数情况下,如果您必须释放获得的一些资源,我会使用ProcessExit event

public class Temp {
   private static readonly Lazy<Temp> instance = new Lazy<Temp>(() => new Temp());

   private void OnProcessExit(Object sender, EventArgs e) {
     // Release native resource if required:
     // some resources e.g. files will be closed automatically,
     // but some e.g. transactions should be closed (commit/rollback) manually
     try {  
       ...
     }
     finally { 
       AppDomain.CurrentDomain.ProcessExit -= OnProcessExit;
     }   
   }

   private Temp() {
     // create IDisposable objects which use native resources

     // If you have to release some resouces on exit
     AppDomain.CurrentDomain.ProcessExit += OnProcessExit;
   }

   public static Temp Instance {
     get {
       return instance.Value;
     }
   }
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该在单例上实现 IDisposable 吗? 的相关文章

  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • 生成 .tail IL 指令的简单 F# 代码是什么?

    我想看看 tailIL 指令 但我一直在编写的使用尾部调用的简单递归函数显然已优化为循环 我实际上是在猜测这一点 因为我不完全确定反射器中的循环是什么样的 我绝对没有看到任何 tail不过操作码 我在项目的属性中检查了 生成尾部调用 我还尝
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • 有没有办法设置 log4net 内存附加程序可以包含的最大错误消息数?

    我想向根记录器添加一个内存附加程序 以便我可以连接到应用程序并获取最后 10 个事件 我只想保留最后 10 个 我担心这个附加程序会消耗太多内存 该应用程序设计为 24 7 运行 或者还有别的办法吗 您需要创建一个自定义附加程序来存储有限数
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D

随机推荐

  • 如何使用 Autofac 注入 AutoMapper?

    将 AutoMapper 注入其他层的正确方法是什么 我读了这个博客post 但是这段代码导致下面的异常 AutoMapper dll 中发生 AutoMapper AutoMapperMappingException 类型的异常 但未在用
  • 限制在 contenteditable 中粘贴(HTML / JS)

    我想阻止用户将不允许的标记粘贴到contenteditable div 我想将粘贴限制为粗体 斜体 删除线 下划线和链接 最好的方法是什么 我正在使用jQuery 这不是重复的JQuery 文本编辑器粘贴而不带格式 我不想在没有格式化的情况
  • Python Selenium Webdriver 检查元素是否不存在需要时间

    在几次 GUI 操作后尝试验证某些按钮不存在 预计不存在 我正在使用 find element by xpath 但它非常慢 超时有什么解决办法吗 实际上 如果未找到指定的元素 WebDriver 的 find element 方法将等待该
  • 有人可以向我解释一下 class << self 吗?

    我第一次进入 Rails 编程 在查看我下载的一些库的代码时 我偶尔会注意到这些代码 class lt lt self def func stuff end end 我尝试在网上搜索解释 但是 在红宝石中 class lt lt foo打开
  • 如何在 WP7 中将多个值数据绑定到单个 TextBlock.Text?

    如何将 2 个属性绑定到单个 TextBlock Text 例如名字和姓氏或当前值和最大值 就像是 IValueConverter public object Convert return string Format 0 max 1 cur
  • 多边形的面积(使用 Python 递归)

    我正在尝试解决 探索Python 书中的一个练习 但是 我想我不理解递归的概念 我写了一些递归函数 所以我知道一些方面 但是 我没有足够的经验 我已经停止学习编程大约一年了 无论如何 让我给你一个完整的问题 多边形可以由 x y 对列表表示
  • 通过字符串调用方法

    我有以下课程 func list function1 function2 function3 class doit object def init self for item in func list if item function1 s
  • Youtube API V3 出现错误 403 禁止

    我的 Youtube Api v3 有问题 问题是想要从上传的视频中获取信息 在执行检索视频信息时 出现错误 403 Forbidden 如果我运行我正在使用的 url 浏览器会返回包含所有视频数据的 Json Visual Studio
  • .NET - 用单个 using 语句替换嵌套的 using 语句

    如果您遇到类似这样的带有嵌套 using 语句 资源的 C 代码 using var response HttpWebResponse request GetResponse using var responseStream respons
  • 浮点运算错误

    我使用以下函数来近似函数在某一点的导数 def prime x f x h if not f x h f x and not h 0 0 return f x h f x h else raise PrecisionError 作为一个测试
  • 通过项目文件从 TFS 中排除文件

    我正在寻找从 TFS 中排除生成的 VS 项目文件的某些文件的可能性 我知道这可能是之后的 vspscc 文件 但我想要的是 在将项目添加到 TFS 之前 我可以告诉 VS 项目文件 其中的某些文件不允许添加到 TFS TFS 中有几个排除
  • jQuery 支持 CSS4 选择器吗?

    jQuery 或其他 JavaScript 库支持 CSS4 选择器吗 甚至浏览器 我如何测试它们 目前 jQuery 支持的唯一 4 级选择器是 has and 的扩展版本 not 这只是因为该规范从 jQuery 本身中汲取了灵感 因为
  • 为什么 Chrome 不断在控制台中显示“无法安装网站:该页面不是从安全来源提供的”?

    每当我查看 Chrome 的控制台时 我都会看到以下错误消息 无法安装网站 该页面不是从安全来源提供的 这种情况是在几天前才开始发生的 而 Chrome 在此期间还没有更新 2019 年 12 月更新 这个答案已经过时了 其中提到的两个标志
  • 为什么需要 HTML 字符实体?

    为什么需要 HTML 字符实体 他们有什么好处 我不明白有什么意义 主要有两件事 它们允许您使用当前字符集中未定义的字符 例如 您可以合法地使用 ASCII 作为字符集 并且仍然通过实体包含任意 Unicode 字符 正如 Simon 所指
  • 使用 Perl 的 HTTP 多部分响应

    是否可以像多部分请求一样提供 HTTP 多部分响应 场景是这样的 我想提供一个 URL 它采用 EmployeeID 参数 作为回报 响应应包含员工的照片 最新的工资单以及姓名 年龄和地址等信息 接收端不是浏览器 而是一个获取此响应并稍后处
  • bash:将某些内容回显到窗口右端(右对齐)

    我正在寻找生成在 bash 中右对齐的成功 失败消息 一个例子是 apache2 执行时产生的结果 sudo etc init d apache2 reload etc 在上面的例子中 apache2 产生的结果非常漂亮和简洁 OK or
  • C++ 正则表达式字符串捕获

    尝试让 C 正则表达式字符串捕获工作 我已经尝试了 Windows 与 Linux Boost 与本机 C 0x11 的所有四种组合 示例代码是 include
  • 如何在 SQL Server 2008 中创建序列

    我正在使用以下代码在 SQL Server 中创建序列 但它显示错误为未知对象类型 请给出解决方案 这是我的代码 create sequence seqval start with 100 increment by 1 minvalue 0
  • SqlAlchemy 在查询表对象时不返回所有行,但在查询表对象列时返回所有行

    更新 下面的解决方案 我对 SqlAlchemy 非常陌生 所以如果这是一个明显的问题 请原谅 当我查询 Table 对象时 我只得到一个结果 数据库中的第一个结果 我的过滤器有 600 多个结果 当我按表上的列查询时 它会返回我期望的所有
  • 我应该在单例上实现 IDisposable 吗?

    我有一个 Windows 服务 其中包含一个单例 该单例又使用一些记录器 消息队列侦听器等 这些类实现了IDisposable 我应该实施IDisposable在单例本身中还是做其他事情来确保服务停止 崩溃后 本机资源一切正常 单例是这样实