.NET 中工作线程和 I/O 线程的简单描述

2023-11-23

在 .NET 中很难找到工作线程和 I/O 线程的详细但简单的描述

我对这个主题的了解很清楚(但技术上可能不准确):

  • 工作线程是这样的线程should使用 CPU 来完成工作;
  • I/O 线程(也称为“完成端口线程”)should使用设备驱动程序来完成工作,并且本质上“不执行任何操作”,仅监视非 CPU 操作的完成情况。

不清楚的是:

  • 尽管 ThreadPool.GetAvailableThreads 方法返回两种类型的可用线程数,但似乎没有公共 API 来安排 I/O 线程的工作。 .NET 中只能手动创建工作线程?
  • 看起来单个 I/O 线程可以监控多个 I/O 操作。这是真的吗?如果是这样,为什么ThreadPool默认有这么多可用的I/O线程?
  • 在一些文本中,我读到回调,由 I/O 线程执行 I/O 操作完成后触发。这是真的吗?考虑到这个回调是CPU操作,这不是工作线程的工作吗?
  • 更具体地说,ASP.NET 异步页面是否使用 I/O 线程?将 I/O 工作切换到单独的线程而不是增加工作线程的最大数量到底有什么性能优势?是因为单个 I/O 线程确实监视多个操作吗?或者 Windows 在使用 I/O 线程时进行更高效的上下文切换?

.net/CLR 中的术语“工作线程”通常指除主线程之外的任何线程,它代表生成该线程的应用程序执行一些“工作”。 “工作”实际上可能意味着任何事情,包括等待某些 I/O 完成。线程池保留工作线程的缓存,因为创建线程的成本很高。

.net/CLR 中的术语“I/O 线程”是指 ThreadPool 保留的线程,以便从“重叠”win32 调用(也称为“完成端口 I/O”)分派 NativeOverlapped 回调。 CLR 维护自己的 I/O 完成端口,并且可以将任何句柄绑定到它(通过 ThreadPool.BindHandle API)。这里的例子:http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx。许多 .net API 在内部使用此机制来接收 NativeOverlapped 回调,尽管典型的 .net 开发人员不会直接使用它。

“工作线程”和“I/O 线程”之间确实没有技术差异——它们都只是普通线程。但 CLR ThreadPool 为每个线程保留单独的池,只是为了避免对工作线程的高需求耗尽所有可用于分派本机 I/O 回调的线程,从而可能导致死锁。 (想象一个应用程序使用所有 250 个工作线程,其中每个线程都在等待某些 I/O 完成)。

开发人员在处理 I/O 回调时确实需要小心,以确保 I/O 线程返回到 ThreadPool——也就是说,I/O 回调代码应该做为回调提供服务所需的最少工作然后将线程的控制权返回给 CLR 线程池。如果需要更多工作,则应将该工作安排在工作线程上。否则,应用程序可能会“劫持”CLR 的保留 I/O 完成线程池以用作普通工作线程,从而导致上述死锁情况。

一些可供进一步阅读的好参考: win32 I/O 完成端口:http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx托管线程池:http://msdn.microsoft.com/en-us/library/0ka9477y.aspx绑定句柄示例:http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx

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

.NET 中工作线程和 I/O 线程的简单描述 的相关文章

  • 字符串与 StringBuilder

    我理解之间的区别String and StringBuilder StringBuilder是可变的 但是两者之间有很大的性能差异吗 我正在开发的程序有很多大小写驱动的字符串附加 500 正在使用StringBuilder更好的选择 是的
  • std::map 只读操作的线程安全

    我有一个 std map 用于将值 字段 ID 映射到人类可读的字符串 当我的程序在任何其他线程启动之前启动时 该映射会被初始化一次 之后就不会再被修改 现在 我为每个线程提供了这个 相当大的 映射的自己的副本 但这显然是内存使用效率低下
  • 如何隐藏 Windows 窗体中控件的大小调整手柄?

    我有一个 UserControl 想在设计时隐藏调整大小手柄 就像 TextBoxControl 一样 它只有两个手柄 左手柄和右手柄 文本框的高度是固定的 除非你说它是多行的 在这种情况下 文本框会显示所有九个大小调整手柄 您需要实现一个
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • 将参数从 Web 表单传递到 Crystal 报表

    我有一份报告 我想将其显示在网络表单上 没有参数的报告运行良好 带参数的报告让我很头疼 这是我在 BindReport 方法中编写的代码 该代码在表单的页面加载事件上调用 ReportDocument rpt new ReportDocum
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • 如果未返回,则在一段时间后终止线程

    我有一个线程从网络或串行端口获取一些数据 如果 5 秒内没有收到数据 则线程必须终止 或返回 false 换句话说 如果线程运行时间超过 5 秒 则必须停止 我用 C 编写 但任何 NET 语言都可以 有两种方法 1 封装超时 从网络或串行
  • .NET 组件和 COM 组件有什么区别

    NET 组件和 COM 组件之间有什么区别 有时我们使用 NET 组件包含在我们的项目中 有时我们包含 COM 引用 背后的想法是什么 NET 组件是托管代码 内存处理已为您完成 COM http en wikipedia org wiki
  • 如何在发送邮件之前验证 smtp 凭据?

    我需要验证在中设置的用户名和密码SmtpClient发送邮件之前的实例 使用此代码 SmtpClient client new SmtpClient host client Credentials new NetworkCredential
  • 查询 dns 别名

    我找到了一些code http msdn microsoft com en us library system net dns gethostbyaddress VS 71 aspx来自 msdn 站点 下面包含代码 看起来它将返回给定服务
  • 将 C# 代码转换为 F#(if 语句)

    我想知道如何转换此代码逐行从 C 到 F 我不想使用任何类型的 F 习惯用法或类似的东西 我想了解如何直接映射C 的构造到 F 这是 C 代码 requires l Length gt 0 int GetMinimumValue List
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 将 C# 字符串传递给非托管 C++ DLL

    我有一个简单的应用程序 它加载一个非托管 dll 并从 C 向它传递一些字符串值 但在 C dll 应用程序中 我收到异常 试图访问读 写保护的内存 我的 DLL 导入如下所示 DllImport X dll CallingConventi
  • 在服务器桌面会话上捕获屏幕

    我开发了一个 GUI 测试框架 可以按计划对我们公司网站进行集成测试 当出现问题时 它会截取桌面等内容 它在专用 Windows Server 2008 上的登录用户上运行 无人值守 问题是在我已断开远程桌面会话连接的桌面上截取屏幕截图 我
  • 标签中的路径显示

    NET 中有没有自动修剪路径字符串的方法 例如 C Documents and Settings nick My Documents Tests demo data demo data emx becomes C Documents dem
  • 如何打开实际上已关闭的 Wifi 适配器的无线电?

    我在用着托管无线网络 http managedwifi codeplex com获取我的 Wifi 适配器的无线电状态 如果收音机实际上已关闭 如何将其打开 像这样的东西 WlanClient wlanClient new WlanClie
  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法

随机推荐

  • 将 PCAP 跟踪转换为 NetFlow 格式

    我想将一些 PCAP 跟踪转换为 Netflow 格式 以便使用 netflow 工具进行进一步分析 有什么办法可以做到这一点吗 具体来说 我想使用 flow export 工具从 netflow 跟踪中提取一些感兴趣的字段 如下所示 fl
  • php 中用于缩小/压缩 javascript 的简单正则表达式搜索和替换?

    你能在 php 中发布正则表达式搜索和替换来缩小 压缩 javascript 吗 例如 这是一个简单的 CSS header Content type text css ob start compress function compress
  • Java 正则表达式 - 重叠匹配

    在下面的代码中 public static void main String args List
  • Java正则表达式精确匹配8位数字

    我有一个简单的正则表达式 应该查找 8 位数字 String number scanner findInLine d 8 但事实证明 它也匹配9位或更多位的数字 如何修复此正则表达式以精确匹配 8 位数字 例如 12345678应该匹配 而
  • 安装镶木地板工具

    我正在尝试在 FreeBSD 机器上安装 parquet 工具 我克隆了这个仓库 git clone https github com apache parquet mr 然后我做了cd parquet mr parquet tools 然
  • 在 OCUnit 中使用核心数据类时出现 Apple Mach-O 链接器错误

    好的 这是我的测试类中的代码 NSManagedObjectContext managedObjectContextWithConcurrencyType NSManagedObjectContextConcurrencyType conc
  • 什么是 CSRF 代币?它的重要性是什么?它是如何运作的?

    我正在编写一个应用程序 Django 确实如此 我只想了解 CSRF 令牌 实际上是什么以及它如何保护数据 如果不使用CSRF token 发布的数据会不安全吗 简单来说 跨站请求伪造 CSRF 假设您当前已登录网上银行 www myban
  • 在 MySql 中将 VARCHAR 转换为 DECIMAL 值

    我已将包含字符串值 例如吃 和浮动值 例如 0 87 的 CSV 文件导入到我的 phpMyAdmin 数据库中的表中 在处理完所有字符串值并仅保留具有十进制值的行后 我需要将这些值从 VARCHAR 转换为 DECIMAL FLOAT 以
  • 定点的反平方根

    我正在寻找定点 16 16 数字的最佳反平方根算法 下面的代码是我到目前为止所拥有的 但基本上它取平方根并除以原始数字 我想得到不除法的倒数平方根 如果它发生任何改变 代码将为armv5te编译 uint32 t INVSQRT uint3
  • 为什么使用 static_cast(x) 而不是 (T)x?

    我听说static cast函数应该优先于 C 风格或简单函数风格的转换 这是真的 为什么 主要原因是经典的 C 类型转换不区分我们所说的static cast lt gt reinterpret cast lt gt const cast
  • 确定为特定函数调用分派哪个方法

    我试图理解一些我没有编写的代码 plot gam在 mgcv 中 并且有一个调用plot 函数带有一些我不认识的奇怪参数 例如 P 我想弄清楚这次调用正在调度哪个绘图方法 findMethod 和类似的功能没有帮助 我认为情节是S3 我尝试
  • php shell_exec 权限被拒绝

    shell exec touch Users Nerses Downloads ads txt 2 gt 1 我的 PHP exec shel exec 函数有问题 它说我没有执行该命令的权限 怎样才能打开这些权限呢 您的 PHP 代码正在
  • sql 2008 中没有索引的表列表

    如何列出 SQL 2008 数据库中没有索引的表 Edit我想要架构名称和表名称 这应该涵盖您正在寻找的内容 即堆表 无聚集索引 并且没有任何非聚集索引 它使用新的系统 2005 2008 年使用的表对象 此外 您可能想要查找具有聚集索引但
  • 添加属性时,如何保留 .NET 程序集的 COM 二进制兼容性?

    我们开发了一个 NET 程序集来存储语言翻译信息 并且需要由 VB6 应用程序使用 我们希望能够更改翻译信息而无需重新编译应用程序 翻译由名为 LanguageServices 的两个文件部分类提供 一个文件是不变的库方法 另一个文件是从
  • 如何在Cypress.io(电子/铬)中设置浏览器语言? [复制]

    这个问题在这里已经有答案了 我的问题是关于配置Cypress以某种语言启动浏览器实例 为了 对本地化 i18n 文本标签进行断言 检查 i18n 功能 在语言之间切换 绕过持续集成 CI CD 的问题 例如 本地计算机 浏览器默认为fr F
  • 如何将 Xcode 降级到以前的版本?

    我偶尔需要使用 Xcode 现在遇到一个问题 我已经升级到 Xcode 4 6 但我使用的另一个软件不支持它 所以我需要返回到 Xcode 4 5 我不习惯 Mac 的一般工作方式 因此如果所提供的答案可以在编写时考虑到这一点 那将会很有帮
  • Resharper Intellisense 可以配置为按字母顺序排序吗?

    我最近更新为使用 VS2013 和 Resharper 8 2 从 VS2010 和 Resharper 6 并发现了一个非常烦人的 feature 因为 Resharper 的智能感知不会按字母顺序对类成员进行排序 举例来说 我有一个名为
  • .NET 中的自定义文化感知日期格式

    在 NET 中 用于格式化 DateTime 值的大多数标准字符串都是区域性感知的 例如 ShortDatePattern d 格式字符串根据当前区域性切换年 月 日部分的顺序 6 15 2009 1 45 30 PM gt 6 15 20
  • PHP 作为 FastCGI 应用程序运行 (php-cgi) - 如何发出并发请求?

    编辑 更新 向下滚动 编辑2 更新 问题已解决 Some background information 我正在用 Java 编写自己的网络服务器 几天前我询问 Apache 与 PHP 的接口到底如何 这样我就可以实现 PHP 支持 我了解
  • .NET 中工作线程和 I/O 线程的简单描述

    在 NET 中很难找到工作线程和 I O 线程的详细但简单的描述 我对这个主题的了解很清楚 但技术上可能不准确 工作线程是这样的线程should使用 CPU 来完成工作 I O 线程 也称为 完成端口线程 should使用设备驱动程序来完成