当前位置: 首页 > news >正文

【C#】Thread.Join()、异步等待和直接join

JogThread.Join() 是 .NET 中 System.Threading.Thread 类的一个方法,用来让当前调用线程暂停执行,直到目标线程(这里是 JogThread)终止为止。以下是它的核心语义和你在 UI 代码里需要注意的几个相关知识点。


1. Thread.Join() 的作用

  • 阻塞调用线程:当你在 A 线程上调用 someThread.Join(),A 线程会停在这一行,直到 someThread 运行完毕(自然退出或抛异常结束)。
  • 无返回值:标准的 Join() 会一直等,没有超时;也有重载 Join(int millisecondsTimeout),可以设置最长等待时间。
// workerThread 是另一个正在执行的线程
workerThread.Start();
// … 做点别的 …
workerThread.Join();  
// 只有当 workerThread 完全结束后,下面这一行才会执行
Console.WriteLine("workerThread 已退出");

2. IsAliveJoin 常见组合

if (JogThread != null && JogThread.IsAlive)
{JogThread.Join();
}
  • IsAlive 检查线程还存活(没终止)再调用 Join
  • 否则如果 Join 在已经结束的线程上调用,.NET 会立刻返回,不会抛异常。

3. winform中在 UI 线程上调用 Join 会带来什么?

  • UI 冻结:WinForms/WPF 的 UI 线程负责不停地处理消息队列(鼠标点击、重绘、动画等)。一旦你在 UI 线程上执行 .Join(),它就不再处理消息,界面完全卡住,直到子线程终结。
  • 无法交互:用户点击按钮、拖动窗口都没有反应,甚至操作系统会提示“应用无响应”。

4. 界面卡在了 Join 那里的原因?

  • 若是按钮事件处理器本身就在 UI 线程上。
  • 当用户点击“xxxx’”触发逻辑时,如果代码进入了 if (JogThread.IsAlive) JogThread.Join();,UI 线程就停在那里等后台 JogThread 结束。
  • JogThread 可能又在等待 UI 线程释放某个资源或控件,结果双向等待 —— 死锁

5. 如何避免 UI 线程被 Join 阻塞?

5.1 用异步等待而不是直接 Join

把阻塞 Join 的工作扔到后台去,再用 await 回到 UI 线程:

// 在 async 方法里
if (JogThread != null && JogThread.IsAlive)
{await Task.Run(() => JogThread.Join());
}

这样,UI 线程发起 await 后会挂起这次事件但继续处理消息。

5.2 完全移除 Join,改成事件/回调

  • 在后台线程跑完后,触发一个事件(如 JogFinished),让 UI 在回调里恢复按钮:
// 后台线程结束时
JogFinished?.Invoke(this, EventArgs.Empty);// UI 订阅该事件
jogService.JogFinished += (_,__)=>this.Invoke(() => { btnPos.Enabled = btnNeg.Enabled = true; });

这样根本不需要在 UI 线程上等待。

5.3 用更现代的 Task 代替 Thread

  • 如果你把 RunJogThread_pJog 改为返回 Task 的异步方法,就可以直接 await 它,而不用操心 Join

    await jogService.RunJogAsync();
    // 到这儿就表示后台跑完了
    

6. 其他

  • 线程安全:任何跨线程操作 UI 控件都必须用 Invoke/BeginInvoke 回到 UI 线程。
  • 超时等待Join(int timeout) 可以避免无限期挂起。
  • 取消机制:配合 CancellationToken,让后台线程在收到取消请求后优雅退出,不靠死等。
  • 后台线程与前台线程Thread.IsBackground 属性决定程序退出时是否等待该线程结束。

异步等待而不是直接 Join

简单来说,二者的核心区别在于:


1. 调用线程是否被 阻塞

  • 直接 Join()

    // 运行在 UI 线程里
    if (jogThread.IsAlive)jogThread.Join();  // ★ 这里 UI 线程被堵住,什么消息都收不到
    

    Join() 会立刻“把调用它的线程”停住,直到目标线程结束——UI 线程一停,就不会刷新界面、响应点击或重绘。

  • 异步等待

    // async 方法里,仍在 UI 线程开始
    if (jogThread.IsAlive)await Task.Run(() => jogThread.Join());
    // ★ 这里 UI 线程会把控制权让出去(继续处理消息),等后台完成后再回来
    

    Task.Run(() => Join()) 会把“等待 Join() 完成”这件事拿到线程池线程上去做,await 则让当前(UI)方法“挂起”,释放 UI 线程去做别的事,等后台那块儿真正完成后再把结果继续推回 UI 线程。


2. UI 响应性

  • Join(): 长时间等待会让界面“卡死”——看起来像“假死”或“无响应”。
  • await Task.Run(...): 等待期间 UI 线程依然可以处理鼠标、键盘、重绘等消息,保持流畅。

3. 异常与超时控制

  • Join(): 没有超时,你只能堵着等;如果想超时要用 Join(timeout),还得写判断逻辑。
  • Task.Run(...); await: 可配合 CancellationTokenTask.WhenAny + Task.Delay 做超时、取消都更自然。

4. 代码可维护性

  • 同步阻塞 风格的代码嵌套过多会变得难读。
  • 异步/await 风格能让“先发起、然后等结果再继续”写得像直线流程,也更容易和现代异步 API(I/O、网络、定时器)配合。

小对比表

Join()await Task.Run(() => Join())
调用线程同一线程(可能是 UI)把阻塞逻辑转到线程池线程,UI 线程自由
UI 响应★ 卡死、假死✓ 保持流畅
超时/取消需要 Join(timeout) 或额外判断可轻松配合 CancellationTokenTask.Delay
代码直观度同步嵌套易混乱异步/await 更自然,易读

相关文章:

【C#】Thread.Join()、异步等待和直接join

JogThread.Join() 是 .NET 中 System.Threading.Thread 类的一个方法,用来让当前调用线程暂停执行,直到目标线程(这里是 JogThread)终止为止。以下是它的核心语义和你在 UI 代码里需要注意的几个相关知识点。 1. Thread.Join() 的…...

Malformed input or input contains unmappable characters解决

JDK 17 文件上传编码异常解决方案技术文档 1. 问题背景 在 JDK 17 环境下,文件上传过程中可能抛出 Malformed input or input contains unmappable characters 错误。此问题通常由以下原因触发: 文件路径/名称包含非 ASCII 字符(如中文、日…...

PYTHON训练营DAY26

一、函数 (一)不带参数的函数 # 定义一个简单的问候函数 def greet():"""打印一句问候语。"""message "大家好!欢迎学习Python函数定义!"print(message)greet()(二&#x…...

奇变偶不变,符号看象限

三角函数诱导公式口诀详解:奇变偶不变,符号看象限 口诀解析 1. 口诀含义 奇变偶不变: 奇/偶:指角度加减的是π/2(90)的奇数倍还是偶数倍 奇数倍(如π/2, 3π/2)→ 函数名改变&…...

基于SpringBoot的家政服务系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

Makefile 在 Go 项目中的实践

在 Go 项目中,Makefile 是一个强大的工具,用于自动化构建、测试和部署流程。它不仅能减少重复命令输入,还能确保团队开发环境的一致性。本文以 CoreDNS(一个高性能 DNS 服务器)的 Makefile 为例,解析其设计…...

关闭所有Nginx进程

要关闭所有Nginx进程,可以使用以下命令。这些命令适用于不同的操作系统。 在Linux/Unix系统中 在Linux或Unix系统中,可以使用killall命令来关闭所有Nginx进程。 sudo killall nginx 在Windows系统中 在Windows系统中,可以使用taskkill命…...

开源模型应用落地-模型上下文协议(MCP)-Resources-资源的使用逻辑

一、前言 在大型语言模型与外部世界交互的探索中,如何高效、灵活地接入多样化数据始终是核心命题。MCP(Model Context Protocol)协议中的Resources 机制,正是为这一问题提供了优雅的解决方案。通过URI(统一资源标识符&…...

如何判断一个网站后端是用什么语言写的

判断一个网站的后端是用什么语言写的,可以从以下几个方面入手: 一、通过响应头(HTTP Response Headers) 使用浏览器开发者工具或工具如 curl 查看网站返回的响应头信息,有时可以看到蛛丝马迹: 示例&#…...

CertiK助力以太坊扩展战略,解析Pectra升级的变革与挑战

近期,美国知名金融科技媒体Benzinga发表文章,深入探讨以太坊Pectra升级的变革性影响,并特别引用了CertiK对潜在风险的权威分析,特别是EIP-7702引入的全新信任模型变化。此次升级不仅重新定义了EOA与智能合约的交互方式&#xff0c…...

【C++】Module CPP:模块化编程 Demo

一、C20 模块简介 C20 模块是 C 语言发展史上的重要革新,它从根本上改变了代码组织方式。相比传统的头文件(#include)机制,模块具有以下核心优势: 隔离编译:模块独立编译,避免重复编译头文件符…...

mvc-service引入

什么是业务层 1)Model1(JSP)和Model2(模糊的mvc): MVC:Model(模型),View(视图),Controller(控制器) 视图层:用于数据展示以及用户交互的界…...

Linux线程互斥锁

1. 什么是互斥锁(Mutex)? 互斥锁(Mutex,Mutual Exclusion) 是一种用于多线程编程的同步机制,用于保护共享资源(如变量、内存、文件等),确保在同一时刻只有一…...

PINN Poisson 1d

📌 一、问题定义 我们要求解的微分方程是 d 2 u d x 2 f ( x ) \begin{equation} \frac{d^2 u}{d x^2} f(x) \end{equation} dx2d2u​f(x)​​ 其中: f ( x ) − 0.49 s i n ( 0.7 x ) − 2.25 c o s ( 1.5 x ) f(x) -0.49sin(0.7x) - 2.25cos(1.5x) f(x)−…...

国内优质沉金PCB厂家有哪些?

在高端电子制造领域,沉金工艺因其优异的抗氧化性、信号完整性和焊接可靠性,成为5G通信、AI服务器、新能源汽车等领域的核心需求。本文精选五家国内技术领先的沉金PCB厂家,从工艺精度、交付效率、品质管控等维度展开深度解析,助力企…...

【Trae插件】从0到1,搭建一个能够伪装成网页内容的小说阅读Chrome插件

【Trae插件】从0到1,搭建一个能够伪装成网页内容的小说阅读Chrome插件 最近,Trae 插件也迎来了更新,Trae 插件(原MarsCode 编程助手)Builder模式全面上线,同时支持 VS Code 、JetBrains IDEs,助…...

2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式

2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式 一、本周热点回顾1. OpenAI发布GPT-5多模态大模型 突破通用智能关键阈值2. 特斯拉Optimus机器人量产版发布 具身智能进入工业场景3. 百度文心ERNIE…...

UDP 多点通信

一、setsockopt/getsockopt 函数详解 1. 函数原型 c #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);…...

什么是TCP协议?它存在哪些安全挑战?

一、TCP协议概述 TCP&#xff08;传输控制协议&#xff09;是互联网中面向连接、可靠的传输层协议&#xff0c;主要负责在不可靠的IP层上实现数据的可靠传输。其核心特点包括&#xff1a; 面向连接&#xff1a;通信前需通过三次握手&#xff08;SYN-SYN/ACK-ACK&#xff09;建…...

《Python星球日记》 第80天:目标检测(YOLO、Mask R-CNN)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、目标检测简介1. 边界框(Bounding Box)与类别标签2. 两阶段 vs 单阶段检测器两阶段检测器特点:单阶段检测器特点:二、YOLO(You Only Lo…...

工业大数据的定义

目录 工业大数据的定义 工业大数据发展历程 工业大数据的特征 工业大数据的处理流程 工业大数据在处理上面临的挑战 工业大数据的有效处理方案 工业大数据处理相关案例 数益工联 x TDengine 中天钢铁 x TDengine 广州某企业工业互联网项目 x TDengine 格创东智 x TD…...

Cursor vs VS Code vs Zed

代码编辑器的世界已经迎来了创新的爆发。曾经由重量级IDE或基础文本编辑器主导的领域,如今开发者们发现自己正在探索全新一波聚焦于AI集成、协作和性能的工具。 在本文中,我们将深入探讨2025年三款流行的编辑器:Cursor、Visual Studio Code (VS Code)和Zed Code Editor。每…...

道通龙鱼系列-混合翼无人机:垂直起降+长时续航

道通龙鱼系列-混合翼无人机&#xff1a;垂直起降长时续航 道通龙鱼系列无人机采用独特的倾转翼尖设计&#xff0c;有效融合多旋翼垂直起降和固定翼长时续航的双重优势&#xff0c;机动、灵活&#xff0c;适应各种复杂起降条件&#xff1b;整机采用快拆和高效气动设计&#xff0…...

单片机-STM32部分:17、数码管

飞书文档https://x509p6c8to.feishu.cn/wiki/TOQqweKHWinugokUyqzcwb0fnTd 原理&#xff1a; 一个二极管等于八个LED组合在一起&#xff0c;想要显示什么形状&#xff0c;就点亮对应LED即可。 数码管根据其公共端所接的阳极和阴极的不同&#xff0c;分为了共阴极数码管和共阳…...

Web安全科普:构建数字世界的“防盗门”

目录 一、Web安全的核心挑战 二、六大核心威胁深度解析 三、安全防御体系构建 四、开发者必备工具包 五、法律合规要点 六、未来安全趋势 一、Web安全的核心挑战 1. 攻击者视角的入口 数据流动路径&#xff1a;用户 → 浏览器 → 网络 → 服务器 → 数据库 脆弱点分布&a…...

深入解析HTTP协议演进:从1.0到3.0的全面对比

HTTP协议作为互联网的基础协议&#xff0c;经历了多个版本的迭代演进。本文将详细解析HTTP 1.0、HTTP 1.1、HTTP/2和HTTP/3的核心特性与区别&#xff0c;帮助开发者深入理解网络协议的发展脉络。 一、HTTP 1.0&#xff1a;互联网的奠基者 核心特点&#xff1a; 短连接模式&am…...

【RAP】RAP动作与流行舞蹈/街舞

RAP动作与流行舞蹈风格的匹配性分析 Rap动作与各种流行舞蹈风格的匹配度如下: 最匹配 街舞(Hip-hop/Street Dance) 完美匹配程度:★★★★★原因:Rap和街舞同源于嘻哈文化,共享相同的文化根基特点:街舞的断点式动作、力量感和即兴性与Rap的节奏完美契合代表动作:Break…...

BUUCTF——web刷题第一页题解

共31题&#xff0c;admin那题没有&#xff0c;因为环境问题&#xff0c;我做的非常卡 目录 极客大挑战 2019]Havefun [HCTF 2018]WarmU [ACTF2020 新生赛]Include [ACTF2020 新生赛]Exec [GXYCTF2019]Ping Ping Ping [SUCTF 2019]EasySQL [极客大挑战 2019]LoveSQL [极…...

windows、Ubuntu、Debian 添加静态路由

1. windows 10 添加静态路由 快捷键win R&#xff1a; 输入 cmd &#xff0c;打开命令行窗口 route print // 查看已经存在的路由 route add 192.168.3.0 mask 255.255.255.0 192.168.3.200 // 添加静态路由 192.168.3.200 为下一跳 route add -p 192.168.…...

服务器连接多客户端

一、epoll 核心函数详解 1. epoll_create/epoll_create1 - 创建 epoll 实例 c #include <sys/epoll.h> int epoll_create(int size); // Linux 2.6.8前需指定size&#xff08;>1&#xff09;&#xff0c;后续版本可忽略 int epoll_create1(int flags); // 推荐使用…...

驿客时光影院酒店升级:雷克赛恩 Cyber Pro 1 如何重塑住宿观影体验

一、影院式酒店新趋势&#xff1a;当住宿邂逅沉浸式观影体验 &#xff08;一&#xff09;驿客时光的差异化突围 成都温江区的驿客时光影院酒店&#xff0c;凭借 “百寸巨幕观影 舒适住宿” 的差异化定位&#xff0c;成为年轻旅客打卡热点。其 20 间主题客房均配备独立投影设…...

Cinema4D 26.014

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 软件概述 Cinema 4D是德国MAXON公司开发的一款专业的3D动画、建模、仿真和渲染软件解决方案&#xff0c;在3D设计领域应用广泛。 功能特点 强大的建模功能 多边形建模&#xff1a;提供了丰富的多边形建模…...

脚本语言Lua

本文来源 &#xff1a;腾讯元宝 Lua是一种轻量级、可嵌入的脚本语言&#xff0c;由巴西里约热内卢天主教大学的Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开发。其设计目标是嵌入应用程序中&#xff0c;提供灵活的扩展和定制功能。 主要特性…...

106. 从中序与后序遍历序列构造二叉树

https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/?envTypestudy-plan-v2&envIdtop-interview-150思路&#xff1a;我们知道后序的顺序是左右根&#xff0c;所以后序数组的最后一个一定是根节点&#xff0c;然后中序…...

全链路压测实战指南:从理论到高可用架构的终极验证

全链路压测实战指南:从理论到高可用架构的终极验证 引言:你的系统,真的准备好迎接洪峰了吗? 凌晨3点,某大型电商平台秒杀活动突袭上线。百万用户同时涌入,订单接口响应时间从200ms飙升到15秒,数据库连接池被瞬间耗尽,支付服务直接“熔断”,连锁反应导致库存混乱、物流…...

分布式AI推理的成功之道

随着AI模型逐渐成为企业运营的核心支柱&#xff0c;实时推理已成为推动这一转型的关键引擎。市场对即时、可决策的AI洞察需求激增&#xff0c;而AI代理——正迅速成为推理技术的前沿——即将迎来爆发式普及。德勤预测&#xff0c;到2027年&#xff0c;超半数采用生成式AI的企业…...

纯前端实现基于位置的天气和动态背景图片

如何为博客首页实现基于位置的天气和动态背景图片 引言 我为我的博客主页添加了根据用户所在位置显示当地天气、日出日落时间&#xff0c;并加载一张与天气和时间段匹配的高质量背景图片&#xff0c;可以显著提升用户体验。想象晴天时展示阳光普照的田野&#xff0c;雨天时呈现…...

1.1 认识编程与C++

认识编程与C教程 目标 理解程序、指令、数据的概念。了解C在现实中的应用场景。学会搭建编程环境&#xff0c;迈出第一步。 一、编程是什么&#xff1f;——给计算机写“魔法指令” 1. 基本概念 程序&#xff1a;一系列指令的集合&#xff0c;像一本“魔法食谱”。 &#x…...

代码随想录算法训练营第60期第三十七天打卡

大家好&#xff0c;今天我们算法训练营的第37天&#xff0c;首先为自己感到骄傲&#xff0c;居然坚持下来了&#xff0c;本来觉得自己可能坚持不下来&#xff0c;但是我硬是坚持下来了&#xff0c;好样的&#xff0c;同时也感谢那些看我的题解给我点赞的朋友&#xff0c;我在这…...

每周靶点:TIGIT、ICAM1及文献分享

本期精选了《抑制性受体TIGIT》《细胞粘附分子ICAM1》《真核蛋白表达&#xff1a;选择合适的条件进行》《文献分享&#xff1a;双特异性和多特异性抗体的可开发性评估》四篇文章。以下为各研究内容的概述&#xff1a; 抑制性受体TIGIT TIGIT是一种具有Ig和ITIM结构域的T细胞免…...

介绍一下什么是 AI、 AGI、 ASI

1. AI&#xff08;人工智能&#xff09;&#xff1a;工具化的“窄域智能”​​ 定义​&#xff1a; AI 是能够执行特定任务的智能系统&#xff0c;依赖大量数据和预设规则&#xff0c;​缺乏自主意识和跨领域通用性。 特点​&#xff1a; ​任务专用​&#xff1a;如图像识…...

部署安装jenkins.war(2.508)

实验目的&#xff1a;部署jenkins&#xff0c;并与gitlab关联bulid 所需软件&#xff1a;jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 实验主机&#xff1a;8.10具有java环境,内存最少为4G&#xff0c;cpu双核 目录 jdk安装 …...

【歌曲结构】2:小节与歌曲结构信息整合

歌曲小节与结构信息整合 我将为您整合小节信息与歌曲结构,创建一个更加详细的JSON数据结构。 处理方法 将小节时间与歌曲结构段落进行匹配为每个小节添加所属段落信息为小节添加格式化的时间戳为小节添加对应时间范围内的歌词{"song_title": "财神庙前许三亿…...

商城系统前端

商城系统的前端技术涉及多个层面的技术选型与架构设计&#xff0c;结合搜索结果中的信息&#xff0c;以下是商城系统前端技术的核心要点及实现方案&#xff1a; ​​一、基础技术栈​​ ​​HTML5 & CSS3​​ ​​功能定位​​&#xff1a;作为前端开发的基础&#xff0c;…...

OpenSSH 漏洞-SSH 服务器面临 MitM 攻击和拒绝服务攻击的风险

OpenSSH 发布了安全更新&#xff0c;修复了两个漏洞&#xff0c;一个是 MitM 攻击漏洞&#xff0c;另一个是拒绝服务漏洞&#xff0c;其中一个漏洞是在十多年前引入的。Qualys 发现了这两个漏洞&#xff0c;并向 OpenSSH 的维护人员展示了其可利用性。 OpenSSH&#xff08;开放…...

PostgreSQL MCP 使用案例

## 概述 PostgreSQL MCP&#xff08;PostgreSQL Multi-host Cluster Provisioning&#xff09;是一种用于部署和管理多节点PostgreSQL集群的工具和架构。它提供了高效的数据库集群管理、高可用性保障和负载均衡功能。本文档将介绍PostgreSQL MCP的基本使用方法和常见应用场景。…...

什么是接口文档,如何使用,注意事项有哪些

一、接口文档的核心内容 基础信息 接口名称&#xff1a;明确功能&#xff08;如“用户登录接口”&#xff09;。 接口地址&#xff1a;URL 或 RPC 路径&#xff08;如 /api/v1/login&#xff09;。 请求方法&#xff1a;HTTP 方法&#xff08;GET/POST/PUT/DELETE&#xff09…...

Swagger go中文版本手册

Swaggo(github.com/swaggo/swag)的注解语法是基于 OpenAPI 2.0 (以前称为 Swagger 2.0) 规范的,并添加了一些自己的约定。 主要官方文档: swaggo/swag GitHub 仓库: 这是最权威的来源。 链接: https://github.com/swaggo/swag重点关注: README.md: 包含了基本的安装、使用…...

[Java实战]Spring Boot + Netty 实现 TCP 长连接客户端及 RESTful 请求转发(二十六)

[Java实战]Spring Boot Netty 实现 TCP 长连接客户端及 RESTful 请求转发&#xff08;二十六&#xff09; 在现代微服务架构中&#xff0c;经常需要在不同服务之间进行高效、可靠的通信。本文将介绍如何使用 Spring Boot 结合 Netty 实现一个 TCP 长连接客户端&#xff0c;并…...

ProfibusDP主站转ModbusRTU/TCP与横河AXG电磁流量计通讯案例

ProfibusDP主站转ModbusRTU/TCP与横河AXG电磁流量计通讯案例 在当今数字化工业时代&#xff0c;智能仪表与控制系统的互联互通成为提高生产效率和管理水平的关键。横河AXG电磁流量计作为一款高性能的流量测量设备&#xff0c;在多个行业得到了广泛应用。而Profibus DP作为一种…...