Dispose 方法的线程安全性?

2023-11-27

MSDN 很好地记录了 BCL 类型的实例成员的线程安全性,但我从未真正看到过信息表明如何Dispose的方法IDisposable可以调用类型。

Is the Dispose方法a)保证对所有类都是线程安全的,b)从不保证是线程安全的,c)保证对某些类是线程安全的(如果是这样,具体记录在哪里)?

最后,如果Dispose方法保证是线程安全的,这是否意味着我必须在使用一次性资源的类中的每个实例方法周围放置一个锁?

侧面观点:我知道类型的终结器应该是线程安全的,因为垃圾收集在 .NET 中的工作方式(相当激进),并且它们可能会调用Dispose方法。不过,我们先把这个问题放在一边。


线程安全和Dispose 的问题有些棘手。由于在许多情况下,一旦任何其他线程开始处置对象,任何线程可以合法地对对象做的唯一事情就是尝试处置它本身,因此乍一看似乎确保线程安全所需的唯一事情是在“dispose”标志上使用 Interlocked.Exchange,以确保一个线程的 Dispose 尝试发生,而另一个线程被静默忽略。事实上,这是一个很好的起点,我认为它应该是标准 Dispose 模式的一部分(CompareExchange 应该在密封的基类包装方法中完成,以避免每个派生类都需要使用自己的私有已处置标志)。不幸的是,如果考虑一下 Dispose 的实际作用,事情就会复杂得多。

Dispose 的真正目的不是对正在处置的对象执行某些操作,而是清理该对象所引用的其他实体。这些实体可能是托管对象、系统对象或完全其他的东西;它们甚至可能与被处置的对象不在同一台计算机上。为了使 Dispose 成为线程安全的,那些其他实体将允许 Dispose 在其他线程可能对它们执行其他操作的同时清理它们。有些对象可以处理这种用法;其他人则不能。

一个特别令人烦恼的例子:允许对象拥有带有非线程安全的RemoveHandler 方法的事件。因此,任何清理事件处理程序的 Dispose 方法都只能从与创建订阅的线程相同的线程中调用。

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

Dispose 方法的线程安全性? 的相关文章

  • 在一个数据库请求中连接 IQueryable 集合

    我使用实体框架 我需要连接两个集合 例如 IQueryable
  • 如何在类文件中使用BackGroundWorker?

    我的program cs调用mdi父frmMain frmMain 然后根据用户操作打开不同的子表单 所有的处理逻辑都写在BusinessLogic cs中 frmMain 在加载时调用 BusinessLogic cs 的方法来初始填充数
  • 当文件已存在时无法创建该文件

    我正在使用 Winforms 并且尝试将文件从一个位置复制到另一个位置 如果同名文件已经存在 我想覆盖它 但我收到类似 当文件已存在时无法创建文件 的错误 我想覆盖该文件 我应该怎么办 我试过File copy代替File move 但我遇
  • 如何使用反应式扩展同时读取交错文件

    我是反应式扩展的新手 我想使用它 在 c 中 来读取包含多个交错流的文件 基本上文件的格式是ABCDABCDABCD 我更喜欢按顺序读取文件并分离流 即AAA BBB 等 并并行处理每个流 为每个流使用单独的线程 必须有某种形式的缓冲来确保
  • 在VB.net中动态添加用户控件

    我在 Vb net Windows 应用程序 中制作了自定义 UserControl 如何将其动态添加到表单中 UserControl 本质上只是另一个类 它继承自 Control 因此您可以使用控件执行各种操作 但除此之外它只是一个类 因
  • 使用 LINQ 迭代类属性

    有一个 ParsedTemplate 类 它有超过 300 个属性 类型为 Details 和 BlockDetails parsedTemplate 对象将由函数填充 填充这个对象后 我需要一个 LINQ 或其他方式 来查找是否有任何属性
  • 如何在应用程序目录层次结构中构建接口?

    将它们全部放在一个单独的文件夹结构中还是与实现它们的类一起放置 切勿将接口与实现它们的类放在一起 除非这些类满足以下要求 这样做将引入一个紧耦合在接口和实现者之间 如果不同时引用实现者 您将无法创建该接口的其他实现 你基本上有两个选择 将接
  • 正则表达式:如何获取组名称

    我有一个 NET 正则表达式 它看起来类似于
  • 您是否必须在 VB.NET 中显式创建表单实例? [复制]

    这个问题在这里已经有答案了 如果一个项目包含Form类 形式可以通过以下方式显示 Form1 Show 或者是否需要首先创建表单的实例 Dim frm As New Form1 frm Show 正如所建议的 使用表单名称使用默认实例 而第
  • 执行鼠标单击而不移动光标

    除了移动光标之外 我找不到任何解决方案Cursor类 点击mouse event然后将光标移动到原来的位置 我正在玩SendInput现在可以运行 但仍然没有机会找到好的解决方案 有什么建议吗 您应该使用 Win32 API 使用 user
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • C#生成的csv文件通过电子邮件发送嵌入到Lotus Note中电子邮件的底部

    我遇到了一个奇怪的问题 即使用 NET SmtpClient 通过电子邮件发送的 CSV 附件出现在电子邮件底部 而不是 Lotus Note 中的附件 我只是不知道如何解决这个问题 而且我无法访问客户端计算机 这使得调试非常困难 我可以采
  • 用户如何在winforms运行时调整控件大小

    假设我有一个图片框 现在我想要的是用户应该能够随意调整图片框的大小 但是我不知道如何开始做这件事 我搜索过互联网 但信息很少 有人至少可以指导我从哪里开始吗 这很容易做到 Windows 中的每个窗口都具有与生俱来的可调整大小的能力 它刚刚
  • .NET Framework 2.0 Service Pack 1 中新增的类型

    我以为 NET 2 0 SP1 中只有错误修复 没有新类型 直到我遇到few http davesbox com archive 2008 08 25 new for visual studio 2008 sp1 and fxcop 1 3
  • .NET 中的错误和异常有什么区别?

    您能向我解释一下错误和异常之间的区别吗 一个例外是利用语言语义的类 正如其他人所说 异常会中断堆栈的执行 直到被捕获 一个例外can用于传达错误 但更一般地用于传达发生了异常情况 另一方面 错误可能是异常的 也可能不是异常的 错误有以下几种
  • 如何在 IIS 中手动配置虚拟目录

    我正在尝试让外部 Visual Studio 解决方案在 Visual Studio Professional 2010 的本地副本中工作 当我打开该解决方案时 我看到一条错误消息 指出本地 IIS URL 尚未配置 我想创建一个虚拟目录吗
  • DBNull 怎么会不等于 DBNull

    我有以下代码行 if DBNull Value Equals o o null where o is object o in row ItemArray我不断收到错误 gt Xml type List of xdt untypedAtomi
  • 正则表达式获取模式的最后一次出现

    我有一个字符串 我需要选择最后一次出现的模式 该字符串是 1302638400000 0 0 1302724800000 0 610 64999999999998 1302811200000 0 2266 6500000000001 130
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • Visual Studio '17 未在参考管理器中显示程序集

    我遇到的问题是 我似乎无法弄清楚如何添加对某些解决方案的引用 在我从 Visual Studio 17 开始的大多数解决方案中 我在解决方案资源管理器中看到 引用 但例如对于 asp net core web api 我得到 依赖项 每当解

随机推荐

  • android.app.Application 无法转换为 com.facebook.react.ReactApplication

    我在我的项目中使用了这个命令 react native upgrade 当我尝试构建应用程序时出现错误 android app Application 无法转换为 com facebook react ReactApplication 我真
  • 从深度图像生成点云

    我正在尝试将深度图像 RGBD 转换为 3d 点云 我目前使用的解决方案取自这个帖子 where cx 图像中心高度 cy 图像中心宽度 fx and fy 250 通过迭代几个选项来选择 深度测量是通过针孔相机进行的 点云远离中心投影 示
  • iOS SDK:通过代码将按钮移动到屏幕中央

    我想通过代码将按钮移动到屏幕中央 我在某个地方看到它只是几行代码 但找不到它们 这会将按钮置于其超级视图的中心 CGRect bounds button superview bounds button center CGPointMake
  • CSRF 与 Spring Security 集成时,会话超时导致 Spring MVC 中的访问被拒绝

    我在 Spring MVC 项目中将 CSRF 令牌与 Spring Security 集成 使用 CSRF 令牌一切正常 令牌将从客户端发送到服务器端 我已经改变了我的logout制作过程POST发送 CSRF 令牌的方法及其工作正常 当
  • 调整图像类型“Mat”的大小 opencv C++

    我想调整图像大小 当图像是 IplImage 时 下面的代码可以工作 但是当我将其更改为 Mat 时 我收到以下错误 无法将 cv Mat 深度 从 int cv Mat const 类型转换为 int 类型 无法将参数 1 的 cv Ma
  • 如何从 R 访问维基百科?

    R 是否有任何包允许查询维基百科 最有可能使用 Mediawiki API 来获取与此类查询相关的可用文章列表 以及导入选定的文章以进行文本挖掘 有WikipediR R 中的 MediaWiki API 包装器 library devto
  • 使用 aiohttp 的 Python lib beautiful soup

    有人知道该怎么做 import html5lib import urllib from bs4 import BeautifulSoup soup BeautifulSoup urllib request urlopen http some
  • UWP 导航示例并重点关注控制

    I use UWP 导航示例作为我的应用程序导航的示例 我需要将焦点设置在 TextBox 上 我试穿一下UWP 导航示例 对于 BasicPage 我添加以下代码
  • 无法实例化活动...由 ClassNotFoundException 引起

    将完美工作的应用程序转换为库 包括其 Activity 类 后 我尝试通过简单地超类化库的活动来创建一个使用整个库的应用程序 package com example baseapp paid import android os Bundle
  • 查找数组中不出现两次的整数

    我正在尝试解决这个问题 在整数数组中 除了单个数字只出现一次之外 所有数字都恰好出现两次 一个简单的解决方案是对数组进行排序 然后测试不重复 但我正在寻找时间复杂度为 O n 的更好的解决方案 您可以对整个数组使用 xor 运算 每对数字都
  • 如何在windows中创建路径长度大于256的目录

    我的文件夹路径中有几个级别的目录 当路径超过 256 时 我无法从中创建子文件夹或文件 有没有机会建造超过这个长度的路径 谁能帮我吗 事实上 路径字符串的限制是 260 个字符 如今 底层操作系统可以支持更长的路径名 最多 32 767 个
  • 如何在android中使用RxJava在活动之间传递数据?

    我需要在两个活动之间传递一些数据MainActivity and ChildActivity 按钮点击MainActivity应该打开ChildActivity并发送带有数据的事件 我有单例 Subject
  • 在 WPF 应用程序中全局设置文化 (en-IN)

    我有一个基于印度的应用程序 我将文化设置为 Thread CurrentThread CurrentUICulture new CultureInfo en IN 上面的代码在之前调用Window InitializeComponent 方
  • MySQL:无法以大驼峰命名法(帕斯卡命名法)为表命名

    我读到 最好的做法是使用帕斯卡命名法 ThisIsMyTableName 来命名表 因此我想更改 MySQL 中的表 但 phpmyadmin 和 SQL Manager 2005 for MySQL 都不会让我这样做 名字仍然以小写形式出
  • Hibernate 注解 - 不区分大小写 UniqueConstraint

    我有一个带有以下注释的实体 Entity Table uniqueConstraints UniqueConstraint columnNames name public class Component extends Model 是否可以
  • 寻找DTLS非阻塞程序示例(C/C++)

    我正在学习使用 SSL 和 UDP 经过一番广泛的搜索 我找不到很多示例程序来测试和研究 事实上 我唯一找到的就是这个 http openssl 6102 n7 nabble com DTLS examples td2143 html 然而
  • 在函数调用上调用 sizeof 会跳过实际调用该函数!}

    我偶然发现了这段代码 int x int a std cout lt
  • 如何用 Swift 制作随机颜色

    如何使用 Swift 制作随机颜色函数 import UIKit class ViewController UIViewController var randomNumber arc4random uniform 20 var random
  • iTunes 应用程序加载器 - 自动化

    最近 Apple 更改了 iTunes Connect 界面 要求人们使用应用程序加载器上传应用程序 这很好 但我需要一个脚本来自动化我的工作 像 App Loader 这样的应用程序如何实现自动化 我正在考虑用 AppleScript 编
  • Dispose 方法的线程安全性?

    MSDN 很好地记录了 BCL 类型的实例成员的线程安全性 但我从未真正看到过信息表明如何Dispose的方法IDisposable可以调用类型 Is the Dispose方法a 保证对所有类都是线程安全的 b 从不保证是线程安全的 c