我应该在单例上实现 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 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 链接 .Net 程序集

    这都是假设 所以请耐心等待 假设我正在用 C 编写一个名为 Foo 的工具 输出是 foo exe 我发现了一些我喜欢使用的非常棒的库 称为 Bar 我可以在我的项目中将其引用为 bar dll 当我构建项目时 我的输出目录中有 foo e
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • 条件类型定义

    如果我有一小段这样的代码 template
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 如何使用 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在单例本身中还是做其他事情来确保服务停止 崩溃后 本机资源一切正常 单例是这样实