C#学习系列相关之多线程(一)----常用多线程方法总结

一、多线程的用途

        在介绍多线程的方法之前首先应当知道什么是多线程, 在一个进程内部可以执行多个任务,而这每一个任务我们就可以看成是一个线程。是程序使用CPU的基本单位。进程是拥有资源的基本单位, 线程是CPU调度的基本单位。多线程的作用不是提高执行速度,而是为了提高应用程序的使用率。我们程序在运行的使用,都是在抢CPU的时间片(执行权),如果是多线程的程序,那么在抢到
CPU的执行权的概率应该比较单线程程序抢到的概率要大.那么也就是说,CPU在多线程程序中执行的时间要比单线程多,所以就提高了程序的使用率.但是即使是多线程程序,那么他们中的哪个线程能抢占到CPU的资源呢,这个是不确定的,所以多线程具有随机。
       多线程就好比在等待水开的同时看报纸,而不是等水开了再开始看报纸。多线程是为了同步完成多项任务,而是为了提高资源使用效率来提高系统的效率。(这个例子并不是很恰当,可以简单理解为水开和看报纸交替执行,交替的速度极快,进而可以看作是两个任务同时执行的)。

二、常用多线程的方法

1、Thread类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{class Program{static void Main(string[] args){for (int i = 0; i < 300; i++){Console.Write(1);}Thread t1 = new Thread(() =>{for (int i = 0; i < 300; i++){Console.Write(2);} });t1.Start();for (int i = 0; i < 300; i++){Console.Write(3);}Console.Read();}}
}

   运行结果:

2、通过Task类(最常用的方法)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{class Program{static void Main(string[] args){for (int i = 0; i < 300; i++){Console.Write(1);}Task t1 = new Task(() =>{for (int i = 0; i < 300; i++){Console.Write(2);} });t1.Start();for (int i = 0; i < 300; i++){Console.Write(3);}Console.Read();}}
}

运行结果:

在C#中多线程的方法主要就是Task方法,效率高,速度快。

提示:本人准备建立一个技术交流群,会将日常学习工作中遇到的问题和解决方案进行分享,同时也会将代码和学习资料上传进去,有什么不懂的问题可以咨询我!+v:SJS66-12

生活所迫打个广告,本人也代购莆田鞋,不是中间商,工厂直接取货,价格优惠质量保证,都是我自己前去挑选,可以视频选购验货!!希望大家支持!!!赚点生活费!!!+v:SJS66-12

 3、线程池ThreadPool类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{class Program{static void Main(string[] args){ThreadPool.QueueUserWorkItem(new WaitCallback(TestThreadPool), new string[] { "test" });for (int i = 0; i < 300; i++){Console.Write(2);}Console.ReadKey();}public static void TestThreadPool(object state){string[] arry = state as string[];//传过来的参数值int workerThreads = 0;int CompletionPortThreads = 0;for (int i = 0; i < 300; i++){Console.Write(1);}ThreadPool.GetMaxThreads(out workerThreads, out CompletionPortThreads);Console.WriteLine(DateTime.Now.ToString() + "---" + arry[0] + "--workerThreads=" + workerThreads + "--CompletionPortThreads" + CompletionPortThreads);}}
}

运行结果:

4、通过begininvoke方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{class Program{static void Main(string[] args){Action a = teat;a.BeginInvoke(null, null);for (int i = 0; i < 300; i++){Console.Write(2);}Console.ReadKey();}static void teat(){for (int i = 0; i < 300; i++){Console.Write(1);}}}
}

运行结果:

5、async和await方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace 线程test1005
{class Program{static void Main(string[] args){test();for (int i = 0; i < 300; i++){Console.Write(3);}Console.Read();}public static async void test(){for (int i = 0; i < 300; i++){Console.Write(1);}await Task.Run(()=> {for (int i = 0; i < 300; i++){Console.Write(2);}});}}
}

运行结果:

本文介绍这几种C#中开启多线程的方法,在后续学习中,会对每一种线程方法进行更深一步的介绍,希望大家多多关注。

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

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

相关文章

快速掌握批量合并视频

在日常的工作和生活中&#xff0c;我们经常需要对视频进行编辑和处理&#xff0c;而合并视频、添加文案和音频是其中常见的操作。如何快速而简便地完成这些任务呢&#xff1f;今天我们介绍一款强大的视频编辑软件——“固乔智剪软件”&#xff0c;它可以帮助我们轻松实现批量合…

C++深入学习part_1

Linux下编译C程序 安装g命令&#xff1a;sudo apt install g 编译命令&#xff1a;$ g *.cc 或者 *.cpp -o fileName; hellworld 编译程序可以看到&#xff1a; namespace命名空间 首先&#xff0c;命名空间的提出是为了防止变量重名冲突而设置的。 浅浅试一下&#xff1…

深度学习基础之参数量(3)

一般的CNN网络的参数量估计代码 class ResidualBlock(nn.Module):def __init__(self, in_planes, planes, norm_fngroup, stride1):super(ResidualBlock, self).__init__()print(in_planes, planes, norm_fn, stride)self.conv1 nn.Conv2d(in_planes, planes, kernel_size3, …

Py之pygraphviz:pygraphviz的简介、安装、使用方法之详细攻略

Py之pygraphviz&#xff1a;pygraphviz的简介、安装、使用方法之详细攻略 目录 pygraphviz的简介 pygraphviz的安装 Graphviz&#xff1a;可视化工具Graphviz的简介、安装、使用方法、经典案例之详细攻略 pygraphviz的使用方法 1、基础用法 2、进阶案例 Algorithm&#…

后端解决跨域(极速版)

header(Access-Control-Allow-Origin: *); header(Access-Control-Allow-Methods:*); 代表接收全部的请求&#xff0c;"POST,GET"//允许访问的方式 指定域&#xff0c;如http://172.20.0.206//宝塔的域名&#xff0c;注意不是&#xff1a;http://wang.jingyi.icu等…

前端try和catch

为什么要使用try catch 使用try...catch语句是为了处理和管理可能会在程序运行过程中发生的异常或错误情况。以下是一些使用try...catch的主要原因&#xff1a; 错误处理&#xff1a;在开发过程中&#xff0c;无法避免地会出现各种错误&#xff0c;如网络请求失败、数据解析错误…

网络和系统操作命令

目录 ping&#xff1a;用于检测网络是否通畅&#xff0c;以及网络时延情况。ipconfig&#xff1a;查看计算机的IP参数配置信息&#xff0c;如IP地址、默认网关、子网掩码等信息。netstat&#xff1a;显示协议统计信息和当前TCP/IP网络连接。tasklist&#xff1a;显示当前运行的…

正点原子嵌入式linux驱动开发——U-boot图形化配置及其原理

经过之前对uboot的学习可以知道&#xff1a;uboot可以通过stm32mp15_trusted_defconfig来配置&#xff0c;或者通过文件stm32mp1.h来配置uboot。还有另外一种配置uboot的方法&#xff0c;就是图形化配置&#xff0c;以前的uboot是不支持图形化配置&#xff0c;只有Linux内核才支…

Mac M1安装ROS1或ROS2

1.首先进入Anaconda官网&#xff0c;安装Anaconda 2.创建、激活并配置环境 #创建环境 conda create -n ROS #激活环境 conda activate ROS #配置环境 conda config --add channels conda-forge conda config --add channels robostack conda config --set channel_priority st…

JMeter工具的介绍,安装

一、本文学习目标 1、能知道JMeter的优缺点 2、能掌握JMeter的安装流程 3、能掌握JMeter线程组的设置 4、能掌握JMeter参数化的使用 5、能掌握JMeter直连数据库操作 6、能掌握JMeter的断言. 二、JMeter简介 &#xff08;1&#xff09;Jmeter详细介绍 **JMeter&#xff08;A…

C++递归函数

在本文中&#xff0c;您将学习创建递归函数。调用自身的函数。 调用自身的函数称为递归函数。并且&#xff0c;这种技术称为递归。 递归在C 中如何工作&#xff1f; void recurse() {... .. ...recurse();... .. ... }int main() {... .. ...recurse();... .. ... } 下图显…

在 ubuntu 22.04 上配置界面服务器 vnc

xrdp服务器的安装 步骤 1.安装服务器 $ sudo apt install tightvncserver // 命令过后并没有启动服务器 // 这个包没有 systemd 脚本,其不被 systemd 管理!!!查看配置 $ cat ~/.vnc/xstartup #!/bin/shxrdb "$HOME/.Xresources" xsetroot -solid grey #x-termina…

08 集群参数配置(下)

Kafka Broker不需要太大的堆内存&#xff1f; Kafka Broker不需要太大的堆内存&#xff1f;应该把内存留给页缓存使用&#xff1f; kafka刷盘时宕机 kafka认为写入成功是指写入页缓存成功还是数据刷到磁盘成功算成功呢&#xff1f;还是上次刷盘宕机失败的问题&#xff0c;页…

搜索与图论总结

算法博文DFSDFS&#xff08;深度优先&#xff09;-CSDN博客BFSBFS(宽度优先)&#xff08;最短路&#xff09;-CSDN博客有向图与无向图有向图与无向图&#xff08;邻接表&#xff09;_无向图有向图邻接表_人生导师yxc的博客-CSDN博客拓扑排序topsort(拓扑排序)-CSDN博客最短路最…

基于SSM+Vue的物流管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;VueHTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 …

[每日算法 - 阿里机试] leetcode19. 删除链表的倒数第 N 个结点

入口 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-nth-node-from-end…

(面试)谈谈我对C++面向对象特性的理解

&#x1f4af; 博客内容&#xff1a;C读取一行内个数不定的整数的方式 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&…

yolov5 web端部署进行图片和视频检测

目录 1、思路 2、代码结构 3、代码运行 4、api接口代码 5、web ui界面 6、参考资料 7、代码分享 1、思路 通过搭建flask微型服务器后端&#xff0c;以后通过vue搭建网页前端。flask是第一个第三方库。与其他模块一样&#xff0c;安装时可以直接使用python的pip命令实现…

golang的切片使用总结二

如果没看golang切片的第一篇总结博客 golang的切片使用总结一-CSDN博客 &#xff0c;请浏览之 举例9&#xff1a;make([]int, a, b)后访问下标a的元素 s : make([]int, 10, 12) v : s[10] fmt.Printf("v:%v", v) 打印结果&#xff1a; panic: runtime error: index …

老卫带你学---leetcode刷题(76. 最小覆盖子串)

76. 最小覆盖子串 问题&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必…