Parallel.ForEach 未生成所有线程

2024-01-03

我在使用 Parallel.ForEach 时遇到一些问题。 我需要模拟几个硬件组件,等待传入连接并回复它。

我当前的代码如下:

Task.Factory.StartNew(() => components, (component) =>
    {
        var listener = new TcpListener(component.Ip, component.Port);
        while(true)
        {
            using(var socket = listener.AcceptSocket())
            {
                 //Read out socket and send a reply
                 socket.Close();
            }
        }
    });

我遇到的问题是:并非每个组件都会创建自己的线程。 即使其中一个线程退出,它们仍然不会产生。

我的集合中当前组件的数量是 40,生成的线程数量是(或者至少看起来是)33。

我的印象是 Parallel.Foreach() 将为传递给它的可枚举集合创建一个新的并行线程。

有什么想法我做错了吗?


它不一定会立即启动每个任务的所有线程。它会检查其工作负载并在处理器的所有核心上进行配置。如果您的任务多于核心,它将停止创建新线程,因为这只会导致大量不必要的上下文切换。但是,如果它认为现有任务/线程被阻止,在这种情况下,它会添加更多线程以便工作可以继续,即启动更多任务,而其他任务被阻止。它不会检测短时间内被阻止的任务。

这可能解释了为什么您没有看到与任务一样多的线程。当任务完成时,系统可以重新使用它所在的线程来放置一个新的、尚未启动的任务。

本博文底部的图表在一定程度上粗略地说明了这一点:http://colinmackay.co.uk/2011/02/08/parallelization-in-net-40-part-1-looping/ http://colinmackay.co.uk/2011/02/08/parallelisation-in-net-40-part-1-looping/。运行最多 4 个任务所需的时间与运行 1 个任务所需的时间大致相同。然后,当添加第 5 个任务时会出现跳转,并且完成所需的时间大致相同,直到第 8 个任务再次跳转时。这是因为我使用的是 4 核系统。

UPDATE

刚刚意识到你的代码永远不会退出任务,因为那里有一个无限循环。我想说任务(离散的工作单元)不是你想要的。除非您专门从任务并行库中获取其他内容,否则在这种情况下,自己使用常规线程可能是更好的解决方案。

对于任务,您几乎无法控制何时创建线程或一次创建多少个线程。 (如果您要从 TPL 获取其他想要保留的内容,您可以编写自己的调度程序来控制这一点)。但是,如果您只是启动一个后台线程,在应用程序的整个生命周期中不断侦听内容,那么我仍然会使用常规线程。

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

Parallel.ForEach 未生成所有线程 的相关文章

  • 如何等待远程 .NET 调试器连接

    今天我遇到了一个问题 我需要远程调试程序 该程序是从另一个系统启动的 所以我真的没有机会在命令行上与它交互 不过我可以很容易地改变它的来源 我需要做的是让程序正常启动 然后等待我用调试器附加到它 我想不出一个让我快乐的方法 我确实发现了这个
  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么 GetThreadTimes 返回

    我试图测量线程中花费的时间以用于进度报告目的 但我从 GetThreadTimes 系统调用中得到非常奇怪的结果 给出以下程序 在 VS 2013 中编译 针对 NET 4 5 using System using System Diagn
  • 抛出并保留堆栈跟踪不符合代码分析所描述的预期

    进行代码分析给了我项目 CA2200 CA2200 重新抛出以保留堆栈详细信息 func 重新抛出捕获的异常并将其显式指定为参数 请改用不带参数的 throw 以保留最初引发异常的堆栈位置 我已经实现了该建议 但无论如何我似乎都得到了相同的
  • 当操作系统显示语言为非英语时获取本地时区标识符

    奇怪的是 TimeZone CurrentTimeZone StandardName根据计算机显示语言返回本地化名称 我想要一个可以提供给的程序化标识符TimeZoneInfo在下面的代码中 TimeZoneInfo timeZoneInf
  • 如何有效确保小数值至少有 N 位小数

    我想在进行算术运算之前有效地确保十进制值至少有 N 个位置 在下面的示例中 3 显然我可以格式化 0 000 然后解析 但它的效率相对较低 我正在寻找一种避免与字符串转换的解决方案 我尝试过以下解决方案 decimal d 1 23M d
  • C# 和匿名对象数组

    这样的表达是什么意思呢 obj DataSource new new Text Silverlight Count 10 Link Tags Silverlight new Text IIS 7 Count 11 Link http iis
  • 使用 async/await 抛出和捕获异常的正确方法

    全部请拿下面的二维码 Task
  • 自定义代码访问安全属性

    我创建了以下属性 Serializable AttributeUsage AttributeTargets Class AttributeTargets Method AllowMultiple true Inherited true pu
  • Windows 7 任务栏:捕获缩略图

    是否可以从 Win7 任务栏捕获 实时 缩略图 我想在我的应用程序中显示 另一个窗口的 预览 但如何使用 NET 提取这些预览 Yes MSDN 杂志解释了如何 http msdn microsoft com en us magazine
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • asp.net core / kestrel中的线程管理

    我正在解决我们已迁移到 asp net core 2 0 的 asp net 应用程序的性能 可扩展性问题 我们的应用程序作为应用程序服务托管在 azure 上 并且在任何中等流量的情况下都很容易崩溃 让我困惑的一件事是如何处理多个并发请求
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • Spring Boot 2.Hikari连接池优化

    我有一个 SpringBoot 应用程序 我正在控制器中进行一些性能测试 我意识到无论我放入控制器的第一个查询是什么 与其他查询相比都需要很长时间 数据库是远程连接 但我无法改变这一点 long t1 System nanoTime men
  • 如何将 YouTube API 持续时间转换为秒? [复制]

    这个问题在这里已经有答案了 为了兴趣 我想转换 YouTube 的视频时长ISO 8601到秒 为了将来证明我的解决方案 我选择了一个很长的视频 http www youtube com watch v 2XwmldWC Ls来测试它 AP
  • 使用 useState React hook 时从状态获取空数据

    我偶然发现了 useState 范围的问题 我正在尝试创建一个动态引导表单 用户可以在其中向组添加更多行 这些行将包含与能源相关的数据 因此 当我添加 2 行并开始更改输入值时 输入环境数据函数触发空数据 最后一个console log 我
  • Node js 对象导出

    有一个非常简单的问题 我找不到关于从 Node js 中的模块导出对象的答案 更具体地说是访问对象属性 这是我导出的对象 exports caravan month july 这是我的主要模块 var caravan require car
  • Invoke-Command 和直接查询的区别

    我目前正在编写一个从服务器查询磁盘信息的脚本 我遇到了一个问题 我真的不知道这里发生了什么 愿你能帮助我 以下代码有效 已替换 ComputerName space1 Invoke Command ComputerName xxxxxx S
  • 测试值是否存在于多个列表中

    我想检查每个列表中是否存在某个值 以下返回True正如预期的那样 但似乎不符合Python风格 正确 更优雅的方法是什么 a 1 2 b 1 3 c 1 4 d 2 5 False in True if 1 in l else False
  • iOS 8.3 打破了自动单元格高度

    长期读者 第一次海报 我在我的应用程序中使用自动单元格高度和自动布局 在 iOS 8 3 和 8 4 中 这一点似乎被打破了 我有一个示例项目 当内置于 8 2 或更低版本时 它可以正常工作 单元格高度由自动布局确定 当内置于 8 3 或
  • PHP gettext() 挪威语

    我正在使用 PHPgettext 简单地将网站转换为其他语言 到目前为止 该解决方案运行良好 英语 匈牙利语 因为我需要将挪威语翻译添加到新网站 当我设置挪威语言环境时setlocale LC ALL nb NO ISO8859 1 get
  • 更改条形图中条形的宽度 (R)

    我想知道如何更改 barchart 函数中条形的宽度 这是代码 rater1 lt c 0 75 0 66 0 73 0 63 barplot rater1 ylim c 0 1 axes TRUE names arg c A B C D
  • gcc给linux ELF添加了哪些功能?

    当用 c 或 asm 链接一个类似 helloworld 的程序时gcc它会将一些内容添加到结果可执行目标文件中 我只知道运行时动态链接器和 start但这些添加的功能是什么样的入口点呢 00000000004003f0 t deregis
  • 如何正确使用 axios params 和数组

    如何向查询字符串中的数组添加索引 我尝试像这样发送数据 axios get myController myAction params storeIds 1 2 3 我得到了这个网址 http localhost api myControll
  • JavaScript:获取数组中的平均对象?

    我试图想出一种方法来使代码变得简单 使用最少的循环和变量 但我遇到了麻烦 我想根据 值 获取数组 数字 中的平均对象 我觉得必须有一种数学方法来获得平均值 而无需在另一个循环中找到最接近的平均值 目前我有这个混乱 var numbers v
  • 无法在 Jenkins Pipeline 中显示 JUnit 测试结果

    我有一段 Jenkins 管道代码 我试图在我的角度代码上运行 JUnit 如果单元测试失败 Jenkins 必须停止管道 它正在工作 只是我看不到 最新测试结果 和 测试结果趋势 我正在使用 Jenkins 2 19 1 Jenkins
  • 导入 CSV 时选择指定行

    我有一个很大的 CSV 文件 我只想导入选择某些行 如果有 首先 我创建将导入的行的索引 然后我希望将这些行的名称传递给 sqldf 并返回指定行的完整记录 create the random rows ids that will be s
  • 安卓Mipmap?

    每当我尝试使用 AndroidStudio 生成新的 Android 项目时 它都会隐藏文件夹 drawables 我以前从未发生过这种情况 我环顾四周 发现它正在生成这个名为 mipmap 的文件夹 我搜索了一下 发现这与绘图类似 但这是
  • 尝试使用 woocommerce_new_order_item 挂钩保存订单项元数据

    Add meta to order item param int item id param array values return void function cart add meta data booking item id valu
  • 使用 Wikimedia API 获取位置

    如何使用 Mediawiki API 获取 Wikipedia 文章的城市 国家位置 假设我想确定圣家族大教堂位于哪个国家 哪个城市 我应该使用什么属性 尝试以下查询 And see 扩展 地理数据 https www mediawiki
  • React Router v4 中的嵌套路由

    我正在尝试设置一些嵌套路由来添加通用布局 检查一下代码
  • 在应用程序购买测试帐户无法在 IOS 中运行?

    我们正在使用沙盒测试帐户测试应用程序购买 在测试时它显示验证 在验证付款信息后 当我尝试在应用程序购买中测试时 它会将我重定向到应用程序商店 应用程序商店显示超时 我做错了什么吗 我还创建了另外三个沙箱测试帐户 用于在应用程序购买中进行测试
  • Parallel.ForEach 未生成所有线程

    我在使用 Parallel ForEach 时遇到一些问题 我需要模拟几个硬件组件 等待传入连接并回复它 我当前的代码如下 Task Factory StartNew gt components component gt var liste