C# 线程对象生命周期

2023-12-31

假设我有一段代码如下:

int Main()
{
    if (true)
    {
       new Thread(()=>
          {
              doSomeLengthyOperation();
          }).Start();
    }
    while (true)
    {
       //do nothing
    }
}

有 2 个线程,我将把正在执行 Main() 函数的线程称为主线程,并将在“if”测试中新建的线程称为线程 A。

我的问题是,线程A什么时候被销毁? doSomeLenghtyOperation() 能够完成吗?

由于没有指向线程 A 的引用,因此它是否会被标记为垃圾回收的候选者:

  1. 在“new Thread().Start()”语句本身完成之后?
  2. 退出“if(true)”范围后立即?
  3. doSomeLengthOperation() 运行完成后?
  4. Never?

我看到的所有示例都是 Main() 持有引用,然后主线程在退出之前等待与线程 A 加入。我很好奇上面代码的生命周期是多少。

提前致谢!


“线程”一词在这里可能有多种含义:

  • System.Threading.Thread 对象(由new Thread()),
  • CLR线程(托管线程),
  • 操作系统线程(非托管线程)。

Start() 方法完成后,线程对象将成为 GC 的候选对象,因为不再有对其的引用。

当 doSomeLengthyOperation() 运行时,托管线程将保持活动状态。

引用article http://msdn.microsoft.com/en-us/magazine/cc163491.aspx#S3作者:James Kovacs,微软 MVP:

托管线程的生命周期是 独立于 Thread 对象 创造了它,这是一件非常好的事情 你不希望 GC 这样做 终止仍在运行的线程 工作只是因为你失去了一切 对关联线程的引用 目的。所以GC正在收集 线程对象,但不是实际的 托管线程。

如果您想亲自尝试,本文还包含一些有用的代码示例。

理论上,操作系统线程与托管线程没有一对一的关系。从MSDN http://msdn.microsoft.com/en-us/library/system.threading.thread%28v=VS.90%29.aspx:

...复杂的主机可以使用 CLR Hosting API 针对同一操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程。

但实际上,CLR 线程今天直接映射到 Windows 线程 http://my.safaribooksonline.com/9780735640467/clr_threads_and_windows_threads.

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

C# 线程对象生命周期 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • SQL JOIN 中的重复记录

    我在 SQL 查询中得到多个结果 我有三个表 付款 信用和费用 在每个月末 我需要根据帐户持有人 我们称之为所有者 进行余额转发 我尝试了不同的查询 但不断收到重复的行 我知道这与我的WHERE条款 但我不知道如何解决它 在我的测试数据中
  • CUDA 链接错误 - Visual Express 2008 - 由于(空)配置文件导致 nvcc 致命

    在过去的两周里 我一直在广泛寻找可能的解决方案来解决我的错误 我已经成功安装了Cuda 64位编译器 工具 和SDK以及64位版本的Visual Studio Express 2008和带有Framework 3 5的Windows 7 S
  • 寻找机器人在房子里定位的方法

    我正在破解一个吸尘器机器人用微控制器 Arduino 控制它 我想要做到打扫房间时更有效率 目前 它只是直行并在碰到物体时转向 但我很难找到最佳算法或方法用于知道它在房间中的位置 我正在寻找一种既便宜 不到 100 美元 又不太复杂 不需要
  • 如何在 Fortran 中即时增加数组大小?

    我的程序通过 3D 数组运行 标记它找到的 簇 然后进行一些检查以查看是否有任何相邻簇的标签高于当前簇 还有第二个数组保存 正确的 簇标签 如果它发现第 n 个相邻簇被正确标记 则将该元素分配给 0 否则将其分配给正确的标签 例如 如果第
  • 如何在 Retrofit 请求正文中 POST 原始整个 JSON?

    这个问题之前可能已经被问过 但没有得到明确的答案 到底如何在 Retrofit 请求的正文中发布原始的整个 JSON 查看类似问题here https stackoverflow com questions 19099536 post bo
  • 使用 SSH 远程运行 Shell 脚本块

    我尝试使用 shell 脚本在不同的服务器上执行命令块 谁能帮我解决这个问题吗 while RecordCount gt 0 do expXXXXX sed n RecordCount p GUID DLT EXPR FILE cut d
  • 如何在 PHP 中检查我是否处于静态上下文中?

    有什么方法可以检查方法是静态调用还是在实例化对象上调用 请尝试以下操作 class Foo function bar static isset this this instanceof self
  • 为什么127*2换成byte结果是-2?

    这是我的代码 public class test public static void main String args byte a byte 127 b 2 byte c byte a b System out println c 为什
  • 如何让div出现在另一个div的前面?

    请参考下面的代码 ul li style height 100px div style height 500px background color black div li ul 从上面的代码我们知道我们只能看到100px高度的黑色背景 我
  • 如何使用 URL 传递 PHP 变量

    我想使用 URL 传递一些 PHP 变量 我尝试了以下代码 链接 php pass php pre code code pre
  • 神经网络发散而不是收敛

    我已经实现了一个 2 层的神经网络 使用 CUDA 每层 2 个神经元 我试图让它使用反向传播学习 2 个简单的二次多项式函数 但它没有收敛 而是发散 输出变得无穷大 以下是有关我尝试过的更多详细信息 我已将初始权重设置为 0 但由于它是发
  • 嵌套Python列表推导式来构造列表列表

    我是一个Python新手 在摸索嵌套列表理解时遇到了麻烦 我正在尝试编写一些代码来读取文件并为每行的每个字符构建一个列表 所以如果文件包含 xxxcd cdcdjkhjasld asdasdxasda 结果列表将是 x x x c d c
  • Nhibernate 中多对多集合的更新导致连接表中的多个删除

    我有一个类 其中包含一个使用 Fluent Nhibernate 映射到多对多数据库关系的集合 映射如下 Table Book Id x gt x Id Map x gt x Title Map x gt x NumberOfPages H
  • JQuery 星级评定 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 任何人都可以建议一个易于设置的简单 JQuery 五星级评级脚本 我只需要单个页面上的单个实例 我不在乎它是否写入文件或 mysql 数据库来计算评分
  • 带 Angular 的鹅毛笔表,无法在编辑模式下工作

    我有一个 Angular 应用程序 我有一个表单并使用了 quill better table https www npmjs com package quill better table https www npmjs com packa
  • WinForms:在设计器中将自定义 ToolStripMenuItem 添加到 MenuStrip

    在 Windows 窗体中如果我创建一个继承自的自定义控件ToolStripMenuItem有没有办法添加这个CustomToolStripMenuItem to MenuStrip来自设计师还是我必须通过代码来完成 自从ToolStrip
  • Scipy 中使用 NaN 值进行 T 检验

    我在 scipy 中进行 t 检验时遇到问题 这让我慢慢发疯 它应该很容易解决 但我所做的一切都不起作用 并且通过广泛的搜索也找不到解决方案 我在最新的 Anaconda 发行版上使用 Spyder 具体来说 我想比较从 csv 文件导入的
  • 在 C 中的循环/IF 结构之外声明变量

    我是 C 语言新手 总体来说是编程新手 我想知道为什么当我在结构外部的 if 语句中声明要使用的变量时 我收到的输出不正确 无论如何对于这段代码 这是我的代码 include
  • 从 URL 下载图像并将其保存到内部存储器的最佳方法

    我正在开发一个应用程序 我想从 URL 下载图像 我需要立即下载这些图像并将其存储到内部存储器中 有超过200张图片可供下载 请告诉我在尽可能短的时间内下载这些图像的最佳方法 如果有任何第三方库可用 请告知 考虑使用毕加索来达到您的目的 我
  • C# 线程对象生命周期

    假设我有一段代码如下 int Main if true new Thread gt doSomeLengthyOperation Start while true do nothing 有 2 个线程 我将把正在执行 Main 函数的线程称