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); //创建子线程1
            Thread childThread2 = new Thread(thread2);//创建子线程2
            childThread1.Start();    //运行子线程1
            childThread2.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();
            //停止主线程1000
            Thread.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();
        }
    }
}

运行结果

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动力电池产业迎来周期性调整,宁德时代开启新角逐?

大爆发之后&#xff0c;新能源电池行业正在迈入紧张的下半场&#xff0c;一些数据显现出迹象。 根据业绩预告情况&#xff0c;目前57家锂电企业中&#xff0c;有45家企业的净利润负增长。另外&#xff0c;据中国汽车动力电池产业创新联盟数据&#xff0c;2月我国动力电池装车量…

【python plotly库介绍】从视觉到洞见:桑基图在业务分析中的应用【保姆级教程过于详细珍藏版】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 本文结构&#xff1a;工具介绍python实现库 - 案例 - 分析思路与过程 实战专栏&#xff1a;https://blog.csdn.net/cciehl/category_12615648.html 备注说明&#xff1a; 企业…

Vue实现图片浏览器

结合之前所学到的v-show&#xff0c;v-on&#xff0c;v-bind写一个图片浏览器。 整个图片浏览器有两个按钮&#xff0c;“上一张”按钮会切换到上一张图片&#xff0c;“下一张”按钮会切换到下一张。切在第一张图片时&#xff0c;“上一张”按钮会隐去不见&#xff1b;同理&a…

星闪BLE与蓝牙

蓝牙与低功耗蓝牙 蓝牙工作在2.4GHz的频段&#xff0c;在工作频段2402MHz-2480MHz上分为79个信道&#xff0c;低功耗蓝牙分为40个信道。一组设备通信的时候&#xff0c;短暂占用一个信道发包&#xff0c;由于其跳频技术&#xff0c;每次传输完数据包之后都会切换到另一个信道继…

云渲染实用工具:3ds max怎么改低版本?

3ds Max是建模领域广泛采用的专业软件&#xff0c;它通过定期更新来不断增强功能和提升性能。但这些频繁的更新有时会导致一些插件暂时无法与新版本完全兼容。为了解决这个问题&#xff0c;设计师们可以采用一个简单有效的方法&#xff0c;那就是将较新版本的3ds Max文件进行版…

js的一些底层

数据类型 按照存储方式&#xff0c;JavaScript的数据类型可以分为两种&#xff0c;原始数据类型&#xff08;原始值&#xff09;和引用数据类型&#xff08;引用值&#xff09;。 原始数据类型目前有六种&#xff0c;包括Number、String、Boolean、Null、Undefined、Symb…

大模型助力学术图谱挖掘!OAG-Challenge @ KDD Cup 2024正式开始

如何用大模型推动学术知识图谱挖掘任务&#xff1f;OAG-Challenge KDD Cup 2024 邀你来赛&#xff01; 竞赛网址&#xff1a;https://www.biendata.xyz/kdd2024/ 竞赛背景 自 1997 年创办以来&#xff0c;知识发现和数据挖掘会议 ACM SIGKDD 上举办的 KDD Cup 被誉为全球最…

【2024】使用zabbix监控ESXI 6.5虚拟化系统

本次实验将采用docker部署zabbix 5.2平台监控ESXI 6.5虚拟化系统—————————————————————————— 请自行准备环境: 关于docker部署方案请参考: docker之核心概念与安装 关于docker部署zabbix方案请参考: docker容器方式部署zabbix监控平台 关于ESXI安…

009_lhs_rhs_in_Matlab中的左值和右值约定

Matlab中的左值和右值约定 1. 左值和右值 我们在把Matlab作为计算器来使用时&#xff0c;有些时候会直接列出一个表达式&#xff0c;等着Matlab打印出计算结果。就这个简单的举动&#xff0c;在计算机科学中&#xff0c;也有一个高大上的名字&#xff0c;叫什么REPL&#xff…

缓冲区溢出漏洞学习总结(漏洞原理及其利用方法)

文章目录 前言1、缓冲区溢出漏洞概述1.1、漏洞概述1.2、缓冲区溢出漏洞概述1.3、缓冲区溢出攻击概述1.4、引发缓冲区溢出的原因 2、栈溢出漏洞2.1、栈溢出漏洞概述2.2、栈溢出漏洞利用2.2.1、利用方法一&#xff1a;修改返回地址2.2.2、利用方法二&#xff1a;覆盖临接变量 3、…

多视图三维重建-SFM简介

背景 掌握传统的多视图三维重建基本流程 总体流程 多视图三维重建的Pipieline如下图&#xff0c;总共分为四个步骤&#xff1a; 拍摄场景多视角的图像建立这些图像之间的联系&#xff08;Data Association&#xff09;SFM稀疏重建MVS稠密重建 Data Association 建立图像…

第十二章 微服务核心(一)

一、Spring Boot 1.1 SpringBoot 构建方式 1.1.1 通过官网自动生成 进入官网&#xff1a;https://spring.io/&#xff0c;点击 Projects --> Spring Framework&#xff1b; 拖动滚动条到中间位置&#xff0c;点击 Spring Initializr 或者直接通过 https://start.spring…

QT_day3:信号和槽的连接方式

1、使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

嵌入式3-29

今日作业&#xff1a;用fwrite 和 fseek功能&#xff0c;将一张bmp格式的图片更改成 德国国旗#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> typedef unsigned char bgr[3]; int main(int argc, const char *argv[])…

用grafana+prometheus+cadvisor监控容器指标数据,并查询当前容器的网速网络用量

前言 整理技术&#xff0c;在这篇文章中&#xff0c;将会搭建grafanaprometheuscadvisor监控容器&#xff0c;并使用一个热门数据看板&#xff0c;再监控容器的性能指标 dashboard效果 这个是node-exporter采集到的数据&#xff0c;我没装node-exporter&#xff0c;而且这也…

3D人体姿态估计项目 | 从2D视频中通过检测人体关键点来估计3D人体姿态实现

项目应用场景 人体姿态估计是关于图像或视频中人体关节的 2D 或 3D 定位。一般来说&#xff0c;这个过程可以分为两个部分&#xff1a;(1) 2D 视频中的 2D 关键点检测&#xff1b;(2) 根据 2D 关键点进行 3D 位姿估计。这个项目使用 Detectron2 从任意的 2D 视频中检测 2D 关节…

【滑动窗口】Leetcode 将 x 减到 0 的最小操作数

题目解析 1658. 将 x 减到 0 的最小操作数 算法讲解 这道题按照题目要求的话会变得很难&#xff0c;因为不仅需要考虑数字减到0&#xff0c;还需要考虑最小的操作数。正难则反&#xff0c;按照这个思路&#xff0c;我们来解析题目 这道题本质上无非就是在左边寻找一段区间&a…

【每日算法】理论: 扩散模型+深度学习基础 刷题:力扣哈希表回顾

上期文章 【每日算法】理论&#xff1a; DALLE 系列 刷题&#xff1a;力扣链表回顾 文章目录 上期文章一、上期问题二、本期问题1、交叉熵损失函数2、SAM模型的mask encoder&#xff08;掩码解码器&#xff09;3、VQVAE的优化问题4、controlnet模型中的zero convolution模块5、…

浪潮信息AIStation与潞晨科技Colossal-AI 完成兼容性认证!

为进一步提升大模型开发效率&#xff0c;近年来&#xff0c;浪潮信息持续加强行业合作&#xff0c;携手业内头部&#xff0c;全面进攻大模型领域。日前&#xff0c;浪潮信息AIStation智能业务创新生产平台与潞晨科技Colossal-AI大模型开发工具完成兼容性互认证。后续&#xff0…

边缘计算盒子 | 什么是边缘计算盒子?选型要看哪些参数?

边缘计算(Edge Computing)是一种分布式计算范式&#xff0c;它将计算资源和数据存储位于离网络核心节点较近的地方&#xff0c;以降低延迟、提高传输速度和数据安全性。通常可以把边缘计算盒子(Edge Computing Box)理解成一种集成了边缘计算功能的硬件设备&#xff0c;通常部署…