在等待挂起操作取消时处置 SemaphoreSlim 是否安全?

2024-02-14

我必须使用 SemaphoreSlim 来确保对代码某些部分的单线程访问,并且希望确保我正确处理所有内容。假设我有以下课程:

public class Foo
{
    private readonly CancellationTokenSource _canceller = new CancellationTokenSource();
    private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);

    ~Foo()
    {
        Dispose(false);
        GC.SuppressFinalize(this);
    }

    public void Dispose()
    {
        Dispose(true);
    }

    protected void Dispose(bool disposing)
    {
        if (_disposed)
            return;

        _canceller.Cancel();

        if (_disposing)
            _semaphore.Dispose();

        _disposed = true;
    }

    public async Task ExecuteAsync()
    {
        try
        {
            await _semaphore.WaitAsync(_canceller.Token);
        }
        catch (OperationCanceledException)
        {
            throw new ObjectDisposedException(nameof(Foo), "Cannot execute on a Foo after it has been disposed");
        }
        
        try
        {
            // Critical section
        }
        finally
        {
            _semaphore.Release();
        }
    }
}

当我打电话时Dispose(true),我有效地逐行执行以下几行:

_canceller.Cancel();
_semaphore.Dispose();

我的问题是,当前正在等待关键部分的任何其他线程/任务会发生什么?我能保证他们永远都能看到消除首先,信号量的处理不会有问题吗?到目前为止,这还没有造成任何问题,但这并不意味着它是安全的。


The SemaphoreSlim 的文档 https://learn.microsoft.com/en-us/dotnet/api/system.threading.semaphoreslim?view=net-5.0看起来你的问题非常具体。

SemaphoreSlim 的所有公共和受保护成员都是线程安全的,可以在多个线程中同时使用,但 Dispose() 除外,Dispose() 必须仅在 SemaphoreSlim 上的所有其他操作完成后才能使用。

保证这一点的唯一真正方法所有其他操作均已完成是为了确保所有任务都已完成,如文档中的示例所示。

public class Foo
{
    private readonly List<Task> _semaphoreTasks = new list<Task>();

    protected void Dispose(bool disposing)
    {
        if (_disposed)
            return;

        _canceller.Cancel();

        if (_disposing) 
        {
            Task.WaitAll(tasks);
            _semaphore.Dispose();
        }

        _disposed = true;
    }

    public async Task ExecuteAsync()
    {
        try
        {
            var task = _semaphore.WaitAsync(_canceller.Token);
            _semaphoreTasks.Add(task);
            await task;
        // ...

这也很可能需要确保在执行处置时将事物添加到列表中。 (您可以将私有类变量设置为本地方法变量,然后将类变量设置为 null)

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

在等待挂起操作取消时处置 SemaphoreSlim 是否安全? 的相关文章

  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行

随机推荐

  • 累积的使用

    我正在解决一个问题 我使用cumulatives 2 3 谓词 但是当我尝试将其与minimize in labeling 我有以下演示 10 个任务 全部持续时间为 1 4 台机器 全部容量 1 我的目标是尽量减少总时间 即minimiz
  • 三重继承会导致元类冲突......有时

    看起来我偶然发现了一个元类地狱 即使我不想与之有任何关系 我正在使用 PySide 在 Qt4 中编写一个应用程序 我想将事件驱动部分与 UI 定义分开 UI 定义是从 Qt Designer 文件生成的 因此 我创建了一个 控制器 类 但
  • 新的 MySQL 驱动程序导致 java.sql.SQLNonTransientConnectionException:需要 CLIENT_PLUGIN_AUTH

    如果更改 MySQL JDBC 驱动程序5 1 38 to 6 0 2我得到以下异常 java sql SQLNonTransientConnectionException CLIENT PLUGIN AUTH is required 该异
  • 函数模板实例化和友元声明

    我刚刚开始学习 C 模板 出于练习目的 编写了这个简单的代码 include
  • heroku -- npm 安装后脚本根据环境运行 grunt 任务

    我有两个 Heroku Node js 应用程序 一个用于产品 一个用于开发 我还有一个包含开发和产品特定任务的 Gruntfile 我知道您可以设置 package json 来运行 grunt 作为 npm 的安装后挂钩 但是您可以根据
  • 通俗地描述.NET程序集循环依赖问题

    请通俗地描述一下 NET程序集编译循环依赖问题 以及其他技术是否有类似的限制 注意 我知道 这似乎是一个简单的问题 但我见过许多真实的 重要的项目 它们完全破坏了依赖关系图 与任何其他循环依赖相同 考虑三个组件 A B 和 C A 需要 B
  • 优化容量利用率的算法

    我为自己设定了一个 简单 的 C 编程挑战 以优化容量 我第一次尝试时表现不佳 如下文所述 因此我想看看是否有一个标准化算法可以做到这一点 而不使用人工智能 启发式技术 因为我根本不知道它们 我相信有一种已知的方法可以做到这一点 因为该问题
  • Rails 4 中 before_action 返回 false 有何作用?

    我正在阅读 使用Rails 4进行敏捷Web开发 第1页 338 它说 回调可以是被动的 监视控制器执行的活动 他们还可以更积极地参与请求处理 如果之前操作回调返回 false 则回调链的处理将终止 并且不会运行该操作 现在我的疑问如下 这
  • SQL Server 在一次调用中返回两次结果?

    我已将 SQL Server 数据库连接到简单的 Node js 服务器 当我运行代码时 我得到了记录集和返回给我的记录集 它们本质上都包含相同的数据 我可以使用这个 但它似乎多余 而且直接调用我需要的记录会更整洁 我希望得到一个清晰的 E
  • 初始化列表无法在 Visual Studio 2012 中使用矢量? [复制]

    这个问题在这里已经有答案了 可能的重复 Visual Studio 2012 中的 C 11 功能 https stackoverflow com questions 7421825 c11 features in visual studi
  • 如何向 bash 提示符添加图标

    我知道你可以通过编辑 bashrc 文件中的 PS1 变量来永久编辑 bash 提示符 我的如下所示 PS1 e 0 31m
  • Snakeyaml 似乎不必要地将简单值包装在列表中

    我正在尝试使用 Groovy 和 Snakeyaml 解析以下 YAML 文件 显然我已经清理了数据 但这足以证明问题 info summary Snakeyaml Issue examples 1st example name Examp
  • oracle SQL 如何从日期中删除时间

    我有一个名为StartDate包含以下格式的日期 03 03 2012 15 22 我需要的是将其转换为日期 它应该看起来像这样 DD MM YYYY 我尝试过但没有成功的是 select p1 PA VALUE as StartDate
  • 自定义流利验证器

    我对使用 fluidvalidator 非常陌生 我所知道的只是基本的rulefor 但说到习惯我就完全无能为力了 有人可以指导我吗 我需要验证可为空的布尔属性 我需要比较 5 个 bool 属性 如果至少选择了其中之一 则它应该返回 tr
  • IntelliJ 不理解 Java9-ea 上的 java 库

    我在用jdk9 ea 149并创建了一个样本javafx应用程序 IntelliJ不理解java库 它显示了所有导入语句红色他们都是变灰 即使是java util List java util ArrayList它有同样的问题 我可以在外部
  • 如何在 SwiftUI 中创建此视图?

    I am trying to create a view like this in SwiftUI sorry it s so huge 具体来说 我试图在屏幕的顶部四分之一处构建滚动的标签 条形图栏行 对我来说 它看起来像一个水平滚动的
  • Keras 中的 CNN 模型条件层

    我正在尝试建立一个conditional CNN模型 模型是 At the first stage我的模型 我将数据提供给Model 1 then based on the prediction of Model 1 我想要train th
  • 如何使用 InteractionManager.runAfterInteractions 使导航器转换更快

    由于逻辑复杂 我必须渲染很多组件this props navigator push 缓慢的导航器转换使应用程序不可用 然后我注意到here http facebook github io react native docs performa
  • 将行添加到 Word 文档中的现有表(打开 XML)

    我需要打开包含现有表 例如 3 列 的现有 Word 文档 docx 并向该表添加新行 有什么办法可以做到这一点吗 我正在使用 Open XML 我正在创建这样的表 第一次 Table tbl new Table Set the style
  • 在等待挂起操作取消时处置 SemaphoreSlim 是否安全?

    我必须使用 SemaphoreSlim 来确保对代码某些部分的单线程访问 并且希望确保我正确处理所有内容 假设我有以下课程 public class Foo private readonly CancellationTokenSource