C# 多线程

文章目录

  • C# 多线程
    • 进程与线程
    • 无参数的子线程
    • 带参数的子线程
      • 运行结果
    • 销毁线程 Abort()
      • 运行结果
    • ThreadPool和Task
      • 运行结果

C# 多线程

进程与线程

进程:进程就是一个应用程序,对电脑的各种资源的占用

线程:线程是程序执行的最小单位,任何操作都是线程完成的,线程依托进程存在的,一个进程可以有多个线程

无参数的子线程

 public static void ChildThread1(){Console.WriteLine("Child thread1 is starts");}

带参数的子线程

ChildThread2是带参数的子线程,所以要使用ParameterizedThreadStart类型的委托来指定子线程
如果使用的是不带参数的委托,不能使用带参数的Start方法运行线程,否则系统会抛出异常。
但使用带参数的委托,可以使用thread.Start()来运行线程,这时所传递的参数值为null。

特别注意:ParameterizedThreadStart委托的参数类型必须是object的

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{public static void ChildThread1(){Console.WriteLine("Child thread1 is starts");}//注意:ParameterizedThreadStart委托的参数类型必须是object的public static void ChildThread2(object obj){Console.WriteLine("Child thread2 is starts,the parameter is {0}", obj);}public static void Main(){ThreadStart thread1 = new ThreadStart(ChildThread1); //通过ThreadStart委托指定子线程的方法ParameterizedThreadStart thread2 = new ParameterizedThreadStart(ChildThread2); //有参的委托Console.WriteLine("MainThread:Creating the child thread1");Console.WriteLine("MainThread:Creating the child thread2");Thread childThread1 = new Thread(thread1); //创建子线程1Thread childThread2 = new Thread(thread2);//创建子线程2childThread1.Start();    //运行子线程1childThread2.Start("子线程2的参数");//运行子线程2,传递参数,//如果使用的是不带参数的委托,不能使用带参数的Start方法运行线程,否则系统会抛出异常。//但使用带参数的委托,可以使用thread.Start()来运行线程,这时所传递的参数值为null。Console.ReadKey();}}
}

运行结果

在这里插入图片描述

销毁线程 Abort()

使用Abort()中止子线程.
通过抛出 threadabortexception 在运行时中止线程。这个异常不能被捕获,如果有 finally 块,控制会被送至 finally 块。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{public static void ChildThread1(){Console.WriteLine("Child thread1 is starts");}//注意:ParameterizedThreadStart委托的参数类型必须是object的public static void ChildThread2(object obj){Console.WriteLine("Child thread2 is starts,the parameter is {0}", obj);}public static void ChildThread3(){try{Console.WriteLine("Child thread3 starts");for (int i = 0; i < 5; i++){Thread.Sleep(100);Console.WriteLine(i);}Console.WriteLine("Child Thread3 Completed");}catch (ThreadAbortException e){Console.WriteLine("Thread Abort Exception");}finally{Console.WriteLine("Couldn't catch the thread Exception");}}public static void Main(){ThreadStart thread3 = new ThreadStart(ChildThread3);Console.WriteLine("MainThread:Creating the child thread3");Thread thread = new Thread(thread3);thread.Start();//停止主线程1000Thread.Sleep(2000);Console.WriteLine("In Main: Aborting the Child thread");thread.Abort();Console.ReadKey();}}
}

运行结果

在这里插入图片描述

ThreadPool和Task

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{public static Thread t = null;public static void ChildThread1(){int i = 5;while (i > 0){Console.WriteLine(string.Format("线程【1】的i:{0} ", i));Thread.Sleep(10);i--;}Console.WriteLine("线程【1】结束");//Console.WriteLine("Child thread1 is starts");}//注意:ParameterizedThreadStart委托的参数类型必须是object的public static void ChildThread2(object obj){int i = 5;while (i > 0){Console.WriteLine(string.Format("线程【2】的i:{0} ", i));Thread.Sleep(10);i--;}Console.WriteLine("线程【2】结束");}public static void ChildThread3(){int i = 5;while (i > 0){Console.WriteLine(string.Format("线程【3】的i:{0} ", i));Thread.Sleep(10);i--;}Console.WriteLine("线程【3】结束");}public static void Main(string[] args){t = new Thread(new ThreadStart(ChildThread1));t.Start();//用线程池ThreadPool.QueueUserWorkItem(ChildThread2, new object());//用Task方法创建System.Threading.Tasks.Task.Factory.StartNew(ChildThread3);Console.ReadLine();}}
}

运行结果

在这里插入图片描述
线程都是独立的,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/578397.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么更新sd-webui AUTOMATIC1111/stable-diffusion-webui ?

整个工程依靠脚本起来的&#xff1a; 可直接到stable-diffusion-webui子目录执行&#xff1a; git pull更新代码完毕后&#xff0c;删除venv的虚拟环境。 然后再次执行webui.sh&#xff0c;这样会自动重新启动stable-diffusion-webui.

转型数据报表开发:奥威BI学习网站如何助你一臂之力?

介绍&#xff1a;奥威BI是一款商业智能工具&#xff0c;专为中国企业设计&#xff0c;提供数据可视化分析功能。以下是关于奥威BI的一些详细信息&#xff1a; 自助式敏捷BI分析&#xff1a;用户可以通过简单的操作&#xff0c;如拖拉拽&#xff0c;制作出炫酷的可视化报表。这种…

Pygame基础7-输入文字

7-输入文字 原理 显示文字只要3步&#xff1a; 创建字体对象渲染文字显示文字 base_font pygame.font.Font(None, 32) user_text : ... text_surface base_font.render(user_text, True, (0, 0, 0)) screen.blit(text_surface, (0, 0))获取用户键盘输入&#xff1a; if…

【C语言】结构体详解 (二) 内存函数、结构体传参

目录 1、 结构体的内存对齐 1.1、对齐规则 1.2、练习1、练习2&#xff08;演示对齐规则1、2、3、4&#xff09; 2、为什么存在内存对齐 2.1、平台原因&#xff08;移植原因&#xff09; 2.2、性能原因 2.3、那么如何即满足对齐&#xff0c;又要节省空间呢&#xff1f; …

基于重写ribbon负载实现灰度发布

项目结构如下 代码如下&#xff1a; pom&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocat…

【群晖】白群晖如何公网访问

【群晖】白群晖如何公网访问 ——> 点击查看原文 在使用默认配置搭建好的群晖NAS后&#xff0c;我们可以通过内网访问所有的服务。但是&#xff0c;当我们出差或者不在家的时候也想要使用应该怎么办呢&#xff1f; 目前白群提供了两种比较快捷的方式&#xff0c;一种是直接注…

TCP/IP 网络模型有哪几层?(计算机网络)

应用层 为用户提供应用功能 传输层 负责为应用层提供网络支持 使用TCP和UDP 当传输层的数据包大小超过 MSS&#xff08;TCP 最大报文段长度&#xff09; &#xff0c;就要将数据包分块&#xff0c;这样即使中途有一个分块丢失或损坏了&#xff0c;只需要重新发送这一个分块…

Delphi模式编程

文章目录 Delphi模式编程涉及以下几个关键方面&#xff1a;**设计模式的应用****Delphi特性的利用****实际开发中的实践** Delphi模式编程的实例 Delphi模式编程是指在使用Delphi这一集成开发环境&#xff08;IDE&#xff09;和Object Pascal语言进行软件开发时&#xff0c;采用…

一篇复现Dockerfile指令

华子目录 制作镜像基于dockerfile制作镜像dockerfile介绍注意 格式PATH上下文路径URL- Dockerfile指令-FROM指令格式示例 Dockerfile指令-MAINTAINER指令介绍示例 Dockerfile指令-COPY指令介绍示例1示例2 Dockerfile指令-ADD指令介绍示例 Dockerfile指令-WORKDIR指令介绍示例 D…

【Roadmap to learn LLM】Large Language Models in Five Formulas

by Alexander Rush Our hope: reasoning about LLMs Our Issue 文章目录 Perpexity(Generation)Attention(Memory)GEMM(Efficiency)用矩阵乘法说明GPU的工作原理 Chinchilla(Scaling)RASP(Reasoning)结论参考资料 the five formulas perpexity —— generationattention —— m…

通过dockerfile制作代码编译maven3.8.8+jdk17 基础镜像

一、背景&#xff1a; paas平台维护过程中有一个流水线的工作需要支持运维&#xff0c;最近有研发提出新的需求要制作一个代码编译的基础镜像出来&#xff0c;代码编译的基础镜像需求如下&#xff1a; maven版本&#xff1a;3.8.8版本 jdk版本&#xff1a;17版本&#xff0c;小…

npm install 报错ERESOLVE unable to resolve dependency tree

描述&#xff1a;npm install 报错ERESOLVE unable to resolve dependency tree 解决方案&#xff1a; npm install --legacy-peer-deps