C# 线程,WaitHandle.WaitAll

2024-01-23

是否可能不使用 WaitHandle.WaitAll(waitHandles) 阻止 winForm,而只是设置另一个线程,当从 WaitHandle.WaitAll 获取 complate 信号时将触发该线程?


我不会使用WaitHandle.WaitAll。这种方法存在一些问题。

  • 有 64 个句柄限制。
  • 它不能在 STA 线程上使用。
  • 它促进了依赖于多个创建的模式WaitHandle明显消耗资源的实例。

相反,我通常使用CountdownEvent当我想等待多个事件时。现在,您将遇到的问题是它仍然需要您致电Wait在某些线程上,这正是您想要避免的。避免进行阻塞调用的标准机制是使用ThreadPool.RegisterWaitForSingleObject方法。但是,不幸的是,这需要WaitHandle and CountdownEvent不继承该类。

解决方案是创建自己的CountdownWaitHandle可以使用的类ThreadPool.RegisterWaitForSingleObject方法。这种方法将允许您指定一个回调委托,一旦WaitHandle已发出信号。

这是最基本的实现CountdownWaitHandle班级。您必须自己添加所有必要的硬编码,但这将帮助您入门。

public class CountdownWaitHandle : WaitHandle
{
    private int m_Count = 0;
    private ManualResetEvent m_Event = new ManualResetEvent(false);

    public CountdownWaitHandle(int initialCount)
    {
        m_Count = initialCount;
    }

    public void AddCount()
    {
        Interlocked.Increment(ref m_Count);
    }

    public void Signal()
    {
        if (Interlocked.Decrement(ref m_Count) == 0)
        {
            m_Event.Set();
        }
    }

    public override bool WaitOne()
    {
        return m_Event.WaitOne();
    }
}

这里的想法是,不要使用许多不同的WaitHandle您使用单个实例CountdownWaitHandle实例。使用所需的计数初始化实例,然后调用Signal减少计数。一旦计数归零WaitHandle将进入有信号状态。所以而不是打电话Set在多个WaitHandle实例并阻止WaitHandle.WaitAll你现在打电话Signal在这个实例上并通过调用阻止WaitOne。同样,您可以使用以下方法推迟对线程池的阻塞调用TheadPool.RegisterWaitForSingleObjectWaitHandle已发出信号。

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

C# 线程,WaitHandle.WaitAll 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 无锁算法真的比全锁算法性能更好吗?

    陈雷蒙德 http blogs msdn com b oldnewthing 一直在做一个huge http blogs msdn com b oldnewthing archive 2011 04 15 10154245 aspx ser
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr

随机推荐

  • React Native 中最新的 doctor 命令的目的是什么

    我正在查看最新的 React Native 博客 其中他们介绍了 React Native 的 doctor 命令 从那里我唯一能理解的是为你做一些环境方面的事情 但我不明白目的 确切的目的是什么doctor反应本机命令 The docto
  • 使用 ColdFusion 加密 SagePay 表单

    我正在尝试使用 ColdFusion 10 遵循 SagePay 3 00 中加密字段的规范 要求是使用提供的密码作为密钥和初始化向量 在 CBC 模式下使用 PKCS 5 填充将字符串加密为 AES 块大小 128 位 并将结果编码为十六
  • ObjectARX、RealDWG 还是 Teigha? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我计划开发一款读取和操作 dwg 文件中的数据的软件 我决定使用 RealDWG 或 Teigha 而不是编写自己的库来处理数据文件的 读取 但
  • Admob 发送成人内容,如何禁用此功能?

    我刚刚完成了我的第一个应用程序 我正在使用 Admob 来发布广告 但在我上传到谷歌游戏商店之前 我已经在我的设备上进行了测试 一切都很顺利 直到今晚晚些时候 Admob 开始为成人内容做广告 有什么方法可以禁用此功能 如果有人下载我的应用
  • 以 JSON 形式返回实体框架对象

    我尝试在控制器中使用以下方法将实体框架对象作为 Json 返回 public JsonResult EventList var results from s in db Events select new OrderID s EventID
  • Hibernate/Spring 4 升级后,ClassCastException Proxy36 无法转换为 SessionImplementor

    编辑 我不是在问whatClassCastException 是 我想知道在 Spring 4 Hibernate 4 的这个特定配置下 在 DetachedCriteria 中是什么导致了它 我正在尝试将一些遗留代码升级到 Spring
  • “当站点管理员使用继承的配置文件中的 锁定对此部分的访问时。”

    因此 我在发布 ASP NET MVC 应用程序时收到此错误 它在本地运行良好 当站点管理员锁定对此的访问时 就会发生这种情况 部分使用
  • 将自定义字体添加到 cordova 项目

    我有一个自定义字体 我想在我的应用程序中使用 字体名称是 myfont 扩展名的文件是 myfont eot myfont svg myfont ttf myfont woff myfont woff2 当我进行 cordova 构建时 它
  • 在链表中使用C++模板,列表中出现多种不同类型

    首先 作为免责声明 这与作业有关 我不是要求任何人为我做作业 只是为了尝试帮助我理解如何正确实现模板 我当前的设置是 我有 A 类 这是一个基类 B C D班都是A班的孩子 我正在尝试创建一个链接列表 在单个列表中可以指向 B C 或 D
  • 仅 CSS 砌体布局

    我需要实现砖石布局 但是 出于多种原因 我不想使用 JavaScript 来完成此操作 参数 所有元素都具有相同的宽度 元素的高度无法在服务器端计算 图像加上各种数量的文本 如果必须的话 我可以接受固定数量的列 有一个简单的解决方案可以在现
  • 表单未保存到数据库

    我为 5K 跑步制作了一个表格 用户输入有关他 她的基本信息 名字 姓氏 电子邮件 组织 是否参加活动 并在查看豁免表格后选中复选框 我在最后放置了一个提交按钮 我在将表单连接到数据库时遇到问题 我已经尝试连接并在 mySql 中制作了一个
  • 随机地形生成

    如何制作一个地形生成器来制作更真实的地形 我当前的生成器可以生成这种类型的地形 我怎样才能让它制作出更真实的地形 比如湖泊和河流 基本上 您在生成的地形上定义并应用一组过滤器 我无法详细说明 但我会提供一些提示供您谷歌 沃罗努图 侵蚀过滤器
  • 如何一次一行读取 csv 文件并随时替换/编辑某些行?

    我有一个 60GB 的 csv 文件 需要对其进行一些修改 客户想要对文件数据进行一些更改 但我不想重新生成该文件中的数据 因为这花了 4 天的时间 如何逐行读取文件 不是将其全部加载到内存中 并随时编辑这些行 替换某些值等 这个过程大概是
  • JQuery Ajax Post 导致 500 内部服务器错误

    我正在尝试执行此 AJAX 帖子 但由于某种原因我收到服务器 500 错误 我可以看到它在控制器中遇到了断点 所以问题似乎出在回调上 任何人 ajax type POST url InlineNotes Note ashx id notei
  • 在 Angular 中使用 bigint 文字时模块解析失败

    我正在开展一个个人项目来尝试学习 Angular 框架 我目前是它的新手 但我已经设法 我认为 包含javascriptbigint在打字稿中正确输入数字 通过在 tsconfig json 文件中定位 esnext 版本 因为这工作正常
  • Bootstrap 轮播上的动画高度变化 (v2.3.2)

    我正在尝试使用 Bootstrap 的轮播来处理高度不同的内容 高度会根据浏览器宽度而有所不同 并且轮播下方有内容 我想使用 CSS 来动画幻灯片之间的高度变化 在朋友的帮助下 我几乎可以在 FireFox 中实现此功能 第一张幻灯片跳转
  • 从 Cognito 触发器发送消息

    我想限制用户从 Cognito 托管的 UI 登录 我可以看到有触发器可以附加 lambda 但是每当我更改 lambda 内部的事件对象时 而不是获取自定义消息User exceeded limits I get unrecognizab
  • 如何像屏保一样改变CAGradientLayer的颜色?

    我被创造了UIView与申请CAGradientLayer颜色效果如我所附图片所示 现在 我想像屏幕保护程序一样平滑地改变它的渐变颜色从上到下的变化 我已经尝试过使用NStimer有点完成了 但它的颜色在改变CAGradientLayer看
  • 智能 JVM 和 JIT 微优化

    随着时间的推移 Sun 的 JVM 和 JIT 已经变得相当智能 过去作为必要的微优化而成为常识的事情不再需要 因为它会为您处理好 例如 过去的情况是 您应该将所有可能的类标记为 Final 以便 JVM 内联尽可能多的代码 然而现在 JI
  • C# 线程,WaitHandle.WaitAll

    是否可能不使用 WaitHandle WaitAll waitHandles 阻止 winForm 而只是设置另一个线程 当从 WaitHandle WaitAll 获取 complate 信号时将触发该线程 我不会使用WaitHandle