C# 使用线程你可能不知道的问题

简介: 前些天有个朋友问我,他在做WinForm 程序,其中使用到了线程。 当时我听到线程我就懵了,其一 我很久都没有使用过线程了,其二 线程说实话有些难,其三 遇到线程稀奇古怪的问题我真的很难回答。当时我就模糊的回答了他一下,就这样勉强的回避了他的问题,因为之前我总是不断的去回避线程这个问题,你说线程简单也简单,你说难也难。

前些天有个朋友问我,他在做WinForm 程序,其中使用到了线程。

当时我听到线程我就懵了,其一 我很久都没有使用过线程了,其二 线程说实话有些难,其三 遇到线程稀奇古怪的问题我真的很难回答。当时我就模糊的回答了他一下,就这样勉强的回避了他的问题,因为之前我总是不断的去回避线程这个问题,你说线程简单也简单,你说难也难。与我来说线程真的是个麻烦事,我一直都是采用回避政策,今天我查阅了之前自己写过的一个WinForm 扫雷游戏,其中就使用过线程。

 

1.在WinForm 中使用线程和定时器控制动画

  

  看到上面的这张图,其实他是一个动画效果,左边的字幕是从下向上不断移动的,而且在不间断的重复这个动作。在进行WinForm开发的时候,我们不能像Web程序一样使用一个Marquee 标签 是字幕移动,这里我们需要的是坐标定位,而且是绝对定位,让字幕坐标不断的改变,从而产生动画效果。

  

2.线程使用带来的后果

  至于效果怎么实现的我们不多说,今天的主题是线程使用的后果。

  

  看看这个扫雷的界面,以前费了九牛二虎之力弄出来这样一个东西,整天埋头于算法当中。当时学习的时候就凭着自己的一股热情,使用线程啊,线程多好,可以让WinForm 产生动画效果。后来我发现自己错了,真的错了。

  

  最头疼的事情来了,大家一定都见过这个问题,我可以说只要使用过线程的几乎到见过这个问题。原因是什么,线程。最大恶极的线程,就是因为我在这个扫雷程序中使用了线程,最终导致了这样的问题。每次在程序重新启动的时候就会出现这个问题,该线程已经被添加到系统线程中,却无法查杀。郁闷啊

 

3.线程介绍

  我查阅了 资料,让我看到了醒目的一行字:

  

 

线程            必须要了解,执行 .NET应用的 线程实际上仍然是Windows 线程。但是,当某个 线程被CLR所知时,我们将它称为受托管的 线程。具体来说,由受托管的代码创建出来的 线程就是受托管的 线程。如果一个 线程由非托管的代码所创建,那么它就是非托管的 线程。不过,一旦该 线程执行了受托管的代码它就变成了受托管的 线程。必须要了解,执行 .NET应用的 线程实际上仍然是Windows 线程。但是,当某个 线程被CLR所知时,我们将它称为受托管的 线程。具体来说,由受托管的代码创建出来的 线程就是受托管的 线程。如果一个 线程由非托管的代码所创建,那么它就是非托管的 线程。不过,一旦该 线程执行了受托管的代码它就变成了受托管的 线程

 

  一个受托管的线程和非托管的线程的区别在于,CLR将创建一个System.Threading.Thread类的实例来代表并操作前者。在内部实现中,CLR将一个包含了所有受托管线程的列表保存在一个叫做ThreadStore地方。

  上面的字段文字是从其他地方贴过来的。但是让我明白了一件事,.net 的线程其实仍然是Windows 线程。说道这里我心里不尽不寒而栗,Windows 线程最可怕的名词。难道真的没有解决办法了,难道这个这个线程真的无法关掉。

 

4.查看任务管理器

  

  打开任务管理器,上面显示很多没有关闭的线程,而且都是关于这个扫雷程序的,天啊。如果这样岂不是会吃掉所有的内存。于是乎,看看下面的代码

代码
 1  public   void  ExitProcess ()
 2          {
 3 
 4              Process[] proc  =  Process.GetProcesses();
 5               for  ( int  j  =   0 ; j  <  proc.Length; j ++ )
 6              {
 7                   if  (proc[j].ProcessName  ==   " MineSweeping " )
 8                  {
 9                      proc[j].Kill();
10                  }
11              }
12 
13          }

 

  Process 这个类就是我的救星啦,他可以获得系统中的进程。只要在我关闭程序的时候每次都对这个进程进行查杀。遇到你 我就kill

  当我再次运行这个程序的时候,哈哈这个问题终于解决了。

 

5.另外一个效果

   

  对比两者 的效果,这事WinForm 窗体退出程序的时候的效果,逐渐退出。

  

代码
 1  public   void  ExitApplication()
 2          {
 3               if  ( this .panelButton.Controls != null )
 4              {
 5                   this .panelButton.Controls.Clear();
 6              }
 7 
 8               for ( int  i = 0 ;i < 1000 ;i ++ )
 9              {
10                   if ( this .Opacity < 0.1 )
11                  {
12                       this .ExitProcess();
13                      Application.Exit();
14                  }
15                   this .Opacity = this .Opacity - 0.004 ;
16                  Thread.Sleep( 20 );
17              }
18               this .main.Dispose();
19          }

 

  其实这个效果就是控制窗体的透明度,渐变效果。这也是线程哦。

  

相关文章
|
6月前
|
人工智能 自然语言处理 运维
让AI读懂K线图!ChatTS-14B:字节开源的时间序列理解和推理大模型,自然语言提问秒解趋势密码!
ChatTS-14B是字节跳动开源的时间序列专用大模型,基于Qwen2.5-14B微调优化,通过合成数据对齐技术显著提升分析能力,支持自然语言交互完成预测推理等复杂任务。
989 1
让AI读懂K线图!ChatTS-14B:字节开源的时间序列理解和推理大模型,自然语言提问秒解趋势密码!
|
Ubuntu Linux 数据安全/隐私保护
国产操作系统优麒麟安装
国产操作系统优麒麟安装
944 0
国产操作系统优麒麟安装
|
机器学习/深度学习 前端开发 5G
前传感知的数据链路层和物理层之上行链路 | 带你读《5G系统关键技术详解》之十四
本节涉及延迟,这是同样重要的影响 5G 部署性能的系统目标。一个重要的例子是跨越数据链路和物理层运行并通过衰落信道保证可靠通信的 HARQ 协议。HARQ 通过传送关于先前已经发送但未被接收机正确接收和确认的数据帧的附加信息来实现该目的。
前传感知的数据链路层和物理层之上行链路  | 带你读《5G系统关键技术详解》之十四
|
6天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
17天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1320 7
|
5天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
296 129
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
4天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
16天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1388 87