MsgWaitForMultipleObjects 的 C# 等效项是什么?

2024-01-12

我有一个带有报表模式 ListView 的 Windows 窗体。对于视图中的每个项目,我需要执行长时间运行的操作,其结果是一个数字。

我在本机 win32 中执行此操作的方法是为每个项目创建一个工作线程(天真地;当然我不会创建无限数量的线程),然后在线程句柄数组上创建 MsgWaitForMultipleObjects() 。每次计算完成后,线程都会发出信号,主 UI 线程将被唤醒并更新。同时,我们会泵送消息,以便 UI 线程保持响应。

任何人都可以提供一个示例来说明这在 C# 中如何工作吗?我查看了 Monitor 对象,它似乎不是我想要的,或者它是否在阻塞时泵送消息?

Thanks.

编辑:似乎 WaitHandler.WaitAny() 实际上可能会泵送消息。看克布鲁姆的论文 http://blogs.msdn.com/cbrumme/archive/2004/02/02/66219.aspx关于 CLR 中的消息泵。


让您的主线程创建一个管理器线程。你可以使用后台工作者 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx为了这。该管理器线程为 ListView 中的每个项目启动一个工作线程。这将允许您的 UI 在后台线程处理时继续响应用户输入而不会挂起。

现在的问题是如何等待每个工作线程完成。不幸的是,我一直无法找到一种方法来获取线程句柄System.Threading.Thread对象。我并不是说没有办法做到这一点;我并不是说没有办法做到这一点。我只是还没找到一个。另一个复杂的方面是System.Threading.Thread类是密封的,因此我们无法从它派生来提供某种“句柄”。

这是我使用的地方手动重置事件 http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx.

假设每个工作线程只是一个ThreadPool线。管理的BackgroundWorker创建一个ManualResetEventListView 中每个项目的对象。作为BackgroundWorker启动每个ThreadPool线程,通过ManualResetEvent作为一个论点QueueUserWorkItem功能 http://msdn.microsoft.com/en-us/library/4yd16hza.aspx。然后,就在每个之前ThreadPool线程退出时,设置ManualResetEvent object.

The BackgroundWorker然后线程可以把所有的ManualResetEvent数组中的对象并使用以下命令等待该数组WaitHandle.WaitXXX功能 http://msdn.microsoft.com/en-us/library/system.threading.waithandle_members.aspx。当每个线程完成时,您可以使用BackgroundWorker的事件来更新 UI 或者您可以使用Control.Invoke()更新 UI 的技术(参见 Marc Gravell 的回答here https://stackoverflow.com/questions/253138/anonymous-method-in-invoke-call).

希望这可以帮助。

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

MsgWaitForMultipleObjects 的 C# 等效项是什么? 的相关文章

  • 错误:表达式不可赋值三元运算符

    我有以下代码 MPLABX XC8 编译器给出此错误 错误 表达式不可分配 U1ERRIRbits RXFOIF uart1 oerr 1 uart1 oerr 0 这是相关代码部分 typedef union struct bool fe
  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 如何以编程方式删除受信任的根证书颁发机构中的证书?

    我需要能够从组织中的每台电脑中删除特定的证书 是的 我可以逐个座位 但我要到周四才能完成 而且我没有人力逐个座位 是否有使用 C 的编程方式来执行此操作 我认为你不需要编写任何 C 看看certmgr exe del http msdn m
  • Erlang 进程如何(如果有的话)映射到内核线程?

    Erlang 因能够支持许多轻量级进程而闻名 它之所以能做到这一点 是因为它们不是传统意义上的进程 甚至不是 P 线程中的线程 而是完全在用户空间中的线程 这很好 实际上很棒 那么 Erlang 线程如何在多核 多处理器环境中并行执行呢 当
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • Objective C - 后台执行选择器并且分离新线程选择器?

    detachNewThreadSelector 和performSelectorInBackground 都用于在后台调用方法 2种方法有什么区别吗 或者它们的工作方式相同吗 它们本质上是相同的 但范式略有不同 他们在幕后做着完全相同的事情
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • 如何配置 qt Creator 以显示 C++ 代码而不是反汇编程序?

    昨天我做了很多事情 比如更新 GCC Clang 和重新安装 Qt Creator 今天 在逐步调试我的代码时 调试器显示的是反汇编代码 而不是我编写的 C 代码 紧迫F10 or F11 调试器正在进入汇编代码而不是 cpp nor h我

随机推荐

  • .NET 中的全局变量(或替代方案)最佳实践

    在 VB NET WinForms 应用程序中存储全局变量的最佳实践是什么 例如 当用户登录应用程序时 您可能希望存储一个可以在整个应用程序中访问的 CurrentUser 对象 您可以将其存储为模块中的对象 或者创建一个包含所有所需全局变
  • 如何使用 Javascript 滚动到底部时附加更多行

    It s in 共享点2010年 但我认为它可能会正常运行 1 默认情况下 每页的项目限制为 30 因此 我已经完成了在页面加载时显示 30 行的列表 然后我将鼠标向下滚动到底部 它隐藏了最后 10 行 Summary 页面加载 30 行
  • ToList 方法不适用于 TrackableCollection

    我们正在 EF 4 0 之上与可跟踪实体合作 为了删除实体及其所有依赖实体 我正在编写一个通用的DeleteDependentEntities 以便从EntityManager 中的Delete 方法调用 我们不 或者不想 依赖于在数据库中
  • 从数据库字段中删除特殊字符

    我有一个包含数千条记录的数据库 我需要删除其中一个字段以确保它只包含某些字符 字母数字 空格和单引号 我可以使用什么 SQL 从整个数据库的该字段中删除任何其他字符 例如斜杠等 update mytable set FieldName RE
  • Angular 7 - 我是否创建了太多订阅?

    我想知道我的代码是否会造成内存泄漏 Context 我有一个应该显示 应用程序 对象的组件类 它具有过滤和分页功能 我创建了一个方法加载应用程序数据 其中我订阅到 向 Web 服务发出请求后返回的 Observable 该方法在初始化时被调
  • 如何配置 spring-kafka 忽略格式错误的消息?

    我们的 Kafka 主题之一存在问题 该主题被DefaultKafkaConsumerFactory ConcurrentMessageListenerContainer组合描述here http docs spring io spring
  • 如何在 Firebase Cloud Storage 上创建存储桶

    我是一名 python 开发人员 我们使用 GCS Google 云存储 来存储过去几个月的图像 这很好 但对于 Android 来说 它需要将所有存储桶导入 Firebase Cloud Storage FCS 才能访问它 我们不需要任何
  • MySQL 中的字段递增是原子操作吗?

    我正在制作一个网站 我想在标准 MyISAM 表中增加一个计数器 简化示例 UPDATE votes SET num num 1 如果多个连接执行相同的查询 这会导致问题吗 或者 MySQL 会处理它并锁定表或其他措施以确保不存在冲突吗 写
  • Android ListView 项目在滚动时重叠

    我已经实施了一个ListView在我的应用程序中使用自定义实现CursorAdapter 我的问题是 每当我快速滚动到列表底部 启动应用程序后 有时我会发现所有绘制的 ListView 项目都相互重叠 如果我向后滚动或触摸其中一项 它们就会
  • 为什么我的数组无法正确打印? [复制]

    这个问题在这里已经有答案了 我正在尝试使用下面的代码编写一个简单的程序来创建一个一维数组 然后您可以使用索引号调用一个值 我在用java questions tagged java and eclipse questions tagged
  • 如何计算带有集合的列表中项目的出现次数?

    假设我有一个List
  • 如何在不停止单元格选择动画的情况下重新加载 UITableView

    当用户点击某个单元格时 我想更新我的UITableView 包括这个被点击的单元格的内容 最简单的方法是更新内部参数然后调用 self tableView reloadData 然而 reloadData立即停止我点击的单元格的漂亮的蓝色
  • QString 到 unicode std::string

    我知道有很多关于转换的信息QString to char 但我仍然需要对这个问题进行一些澄清 Qt提供QTextCodecs 要转换QString 内部以 unicode 形式存储字符 QByteArray 允许我检索char 它表示某种非
  • 推送到 CI 服务器内的 GitLab 存储库(部署密钥)

    GitLab 有这个很好的 部署密钥 功能 对于 CI 服务器读取和提取对存储库的访问权限非常有用 因为它们通常不需要更多功能 但是 我需要创建一个标签并将其推送到存储库 以标记从 master 分支构建的每个版本 更具体地说 我有一个 J
  • 字符串操作。查找 2 个索引之间的字符串

    给定一个字符串 例如 500 个字符 我想在索引 400 和索引 430 之间选择一个字符串 怎么写这样的函数呢 Thanks Use the string Substring http msdn microsoft com en us l
  • 将动态对象传递给角度模块的 forRoot()

    我正在使用该包ngx cookieconsent它将模块导入为 const cookieConfig NgcCookieConsentConfig cookie domain localhost theme block content po
  • SSIS foreach 与简单对象列表

    re SSIS http en wikipedia org wiki SQL Server Integration Services Foreach http msdn microsoft com en us library ms14172
  • 如何为一系列日期设置 Slack 提醒

    例如 我希望每天在我休息的日子里在特定频道中出现提醒 就像是 remind channel me will be on PTO 1 1 2016 until 1 5 2016 然后 在该范围内的每一天 频道中都会出现一条提醒 说明日期范围
  • Html 5视频标签和编解码器问题

    我有一个 mkv 文件 它的视频编解码器是avc 音频编解码器是ac3 如何将其放入 html5 视频标签中 我用
  • MsgWaitForMultipleObjects 的 C# 等效项是什么?

    我有一个带有报表模式 ListView 的 Windows 窗体 对于视图中的每个项目 我需要执行长时间运行的操作 其结果是一个数字 我在本机 win32 中执行此操作的方法是为每个项目创建一个工作线程 天真地 当然我不会创建无限数量的线程