记录|多线程和异步简单理解

目录

  • 前言
  • 一、单线程
  • 二、多线程-Thread
    • 多线程是都多少个的时候会导致性能变差
  • 三、多线程-Task类
    • Task的优势
  • 四、异步- await
    • await
      • 注意:多个Task Run()天剑await后,变成了同步执行
        • 解决方法
  • 更新时间


前言

参考视频:C#基础教程 多线程编程入门 Thread/Task/async/await 简单秒懂!

中型项目中就会涉及到性能的问题。我主要是在C# winform中创建多个需要持续监听的事件后,会遇到性能的问题。这里面一般会遇到选择是多线程的方式还是异步的方式,有时候定时器创建多个后,也会导致性能变差。


一、单线程

单线程:就是一次只能做一件事。
点击炒菜后,只能等菜炒好了,才能做其他事【如下图:】
在这里插入图片描述

        private void button1_Click(object sender, EventArgs e)
        {
            Thread.Sleep(3000);
            MessageBox.Show("一盘菜炒好了【青椒土豆丝】","友情提示");
            Thread.Sleep(5000);
            MessageBox.Show("一盘菜炒好了【红烧肉】", "友情提示");
        }

二、多线程-Thread

多线程:几乎同时完成多件事。
例如,一边炒菜,一边做饭。
在这里插入图片描述
上面就是创建个线程类并实例化,最后通过Start()方法来启动。
但是,启动做什么事情呢?这里就需要在实例化的过程中告诉线程。下面是采用lamda方法 () => { }
即、new Thread()里面是个委托、或者是个方法:

        private void button2_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(() => {
                Thread.Sleep(3000);
                MessageBox.Show("一盘菜炒好了【青椒土豆丝】", "友情提示");
                Thread.Sleep(5000);
                MessageBox.Show("一盘菜炒好了【红烧肉】", "友情提示");
            });
            t.Start();
        }

在这里插入图片描述

多线程是都多少个的时候会导致性能变差


三、多线程-Task类

C#中较常用的方法,是任务类,下图就是任务开始执行的写法:
在这里插入图片描述
但是,任务执行什么操作,是要在Run()中指示清楚的。如下代码:

        private void button3_Click(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("一盘菜炒好了【青椒土豆丝】", "友情提示");
                Thread.Sleep(5000);
                MessageBox.Show("一盘菜炒好了【红烧肉】", "友情提示");
            });
        }

在这里插入图片描述

Task的优势

上面用一个Task,是需要花8秒做完青椒土豆丝和红烧肉。
可以用2个Task,让两盘菜同时做,只需要5秒钟。
在这里插入图片描述

        private void button4_Click(object sender, EventArgs e)
        {
            Task.Run(() => {
                Thread.Sleep(3000);
                MessageBox.Show("一盘菜炒好了【青椒土豆丝】", "友情提示");
            });
            Task.Run(() => {
                Thread.Sleep(5000);
                MessageBox.Show("一盘菜炒好了【红烧肉】", "友情提示");
            });
        }

四、异步- await

我们想两盘菜做好后再开始吃饭。下面的写法是否有问题呢:

        private void button5_Click(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("一盘菜炒好了【青椒土豆丝】", "友情提示");
                Thread.Sleep(5000);
                MessageBox.Show("一盘菜炒好了【红烧肉】", "友情提示");
            });
            MessageBox.Show("菜做好了,开始吃饭");
        }

在这里插入图片描述
很明显,这是不符合我们的要求的。

await

在Task前面添加await,让任务变为异步。此时方法名签名需要添加async。如下代码所示:

        private async void button5_Click(object sender, EventArgs e)
        {
           await Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("一盘菜炒好了【青椒土豆丝】", "友情提示");
                Thread.Sleep(5000);
                MessageBox.Show("一盘菜炒好了【红烧肉】", "友情提示");
            });
            MessageBox.Show("菜做好了,开始吃饭");
        }

这样子,就实现了等炒菜这件事情完成后,再通知。

注意:多个Task Run()天剑await后,变成了同步执行

        private async void button5_Click(object sender, EventArgs e)
        {
            await Task.Run(() => {
                Thread.Sleep(3000);
                MessageBox.Show("一盘菜炒好了【青椒土豆丝】", "友情提示");
            });
            await Task.Run(() => {
                Thread.Sleep(5000);
                MessageBox.Show("一盘菜炒好了【红烧肉】", "友情提示");
            });
            MessageBox.Show("菜做好了,开始吃饭");
        }

在这里插入图片描述

解决方法

创建Task类型的List类,然后将B需要开始执行的前置条件A都放入到列表中。
之后,等列表中的所有内容都完成后,开始执行B。

        private void button5_Click(object sender, EventArgs e)
        {
            List<Task> ts = new List<Task>();
            ts.Add(
                            Task.Run(() =>
                            {
                                Thread.Sleep(3000);
                                MessageBox.Show("一盘菜炒好了【青椒土豆丝】", "友情提示");
                            })
                );
            ts.Add(
                            Task.Run(() =>
                            {
                                Thread.Sleep(5000);
                                MessageBox.Show("一盘菜炒好了【红烧肉】", "友情提示");
                            })
                );

            Task.WhenAll(ts).ContinueWith(t =>
            {
                MessageBox.Show("菜做好了,开始吃饭");
            });
        }

在这里插入图片描述


更新时间

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

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

相关文章

凸极式发电机的相量图分析和计算,内功率因数角和外功率因数角和功角的定义。

图1&#xff1a;同步发电机稳态相量图 若发电机为凸极式&#xff0c;由于凸极机正、交轴同步电抗不等&#xff0c;即xd≠xq&#xff0c;因此必须先借助虚构电动势 E ˙ Q E ˙ q − ( x d − x q ) I ˙ d \dot{E}_Q\dot{E}_q-(x_d-x_q)\dot{I}_d E˙Q​E˙q​−(xd​−xq​)…

C语言原码、反码和补码的详解

C语言原码、反码和补码的详解 放在最前面的1、前言正数的原码、反码和补码负数的原码、反码和补码 2、整数的原码&#xff08;2.1&#xff09;原码的定义&#xff08;2.2&#xff09;计算原码 3、整数的反码&#xff08;3.1&#xff09;反码的定义&#xff08;3.2&#xff09;计…

idea 导入Spring源码遇到的坑并解决

1.下载相关文件 通过百度网盘分享的文件&#xff1a;Spring 链接&#xff1a;https://pan.baidu.com/s/1r9rkGOCaY9SFn9ecng5cIg?pwd8888 提取码&#xff1a;8888 2.配置gradle环境 gradle下载地址 需要翻墙下 https://services.gradle.org/distributions/ 我选择的是 grad…

Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)

文章目录 零、写在前面一、水平拆分(sharding/分片)、故障转移(failover)机制介绍水平拆分&#xff08;Sharding&#xff09;故障转移机制 二、Redis的水平拆分的机制有关的配置1. 环境准备2. 配置文件配置3. 启动所有Redis实例4. 创建集群5. 测试集群读/写6. 集群管理 三、Red…

C++STL详解(九)map和set的使用

一.关联式容器的介绍 CSTL包含了序列式容器和关联式容器&#xff1a; 序列式容器里面存储的是元素本身&#xff0c;其底层是线性的数据结构&#xff0c;就譬如我们之前学习的vector&#xff0c;list&#xff0c;deque等等。关联式容器里面存储的是<key,value>的键值对&…

goframe开发一个企业网站 模版界面4

###goframe已有了模板的功能 {{"string"}} // 一般 string {{raw string}} // 原始 string {{c}} // byte {{print nil}} // nil 也被支持 {{. | FuncA | FuncB | FuncC}}{{if .condition}}... {{else}}{{if .condition2}}...{{end}} {{end}}{{rang…

一、k8s快速入门之学习Kubernetes组件基础

一、三个容器管理器平台 Apache MESOS 开源的分布式资源管理框架&#xff0c;被推特选为基础平台&#xff0c;2019年推特换位k8s&#xff0c;MESOS最新版可以在MESOS上管理k8sDOCKER SWARM docker总部发行的&#xff0c;实现docker的集群方案&#xff0c;和docker捆版一起&…

初始JavaEE篇——多线程(7):定时器、CAS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 定时器的使用 定时器的原理 模拟实现定时器 CAS 介绍 CAS的应用场景 解析 AtomicInteger 类 实现自旋锁 CAS的缺陷…

【UGUI】为射击游戏添加动态显示的分数和血量到UI界面

项目背景 在这个项目中&#xff0c;我们希望实现一个简单的游戏系统&#xff0c;其中玩家可以通过击中目标来获得分数&#xff0c;同时通过与怪物碰撞来减少血量。分数和血量需要在游戏界面上实时显示&#xff0c;以便玩家能够随时了解自己的状态。 技术实现 1. 静态变量的使…

stm32引脚PB3、PB4、PA15作为普通IO口用时,需要先解除调试端口复用

当项目调试的时候&#xff0c;发现PA15引脚无论配置输出高还是低或者输入&#xff0c;均只能输出3.3V的高电平。 目前STM的硬件调试有两种方法&#xff0c;JTAG和SW的方式&#xff0c;目前个人认为最好的方式就是SW&#xff0c;因为它只占用PA13和PA14两个IO。而JTAG还要多占用…

MATLAB与STK互联:仿真并获取低轨卫星与指定区域地面站的可见性数据

MATLAB控制STK实现&#xff1a;仿真并获取低轨卫星与指定区域地面站的可见性数据 本次仿真主要参考了多篇文献和网站&#xff0c;包括但不限于&#xff1a;《Using MATLAB for STK Automation》、CSDN博文&#xff1a; 拜火先知的博客_CSDN博客-笔记、AGI官网有关MATLAB的内容…

用Python设置、更新和获取Excel单元格的值

Excel工作簿作为一款广泛使用的数据管理工具&#xff0c;与Python相结合&#xff0c;可以使得自动化处理大量数据成为可能。通过Python来设置、更新以及读取Excel单元格的值&#xff0c;不仅可以极大地提高工作效率&#xff0c;减少重复劳动&#xff0c;还能增强数据处理流程的…

Golang | Leetcode Golang题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; func findMaxLength(nums []int) (maxLength int) {mp : map[int]int{0: -1}counter : 0for i, num : range nums {if num 1 {counter} else {counter--}if prevIndex, has : mp[counter]; has {maxLength max(maxLength, i-prevIndex)} …

提升网站安全性 HTTPS的重要性与应用指南

内容概要 在如今数字化快速发展的时代&#xff0c;网站安全显得尤为重要。许多用户在访问网站时&#xff0c;尤其是涉及个人信息或金融交易时&#xff0c;对数据传输的安全性有着高度的关注。HTTPS&#xff08;超文本传输安全协议&#xff09;正是为了满足这种需求而诞生的。通…

DICOM标准:解析DICOM属性中的病人模块

目录 病人模块概述 1. 病人关系模块&#xff08;Patient Relationship Module&#xff09; 2. 病人识别模块&#xff08;Patient Identification Module&#xff09; 3. 病人统计模块&#xff08;Patient Demographic Module&#xff09; 4. 病人医学模块&#xff08;Pati…

编写高性能爬虫抓取股票行情数据

最近给一个私募大佬帮忙做了一些股票交易有关的系统&#xff0c;其中涉及到行情数据抓取的问题&#xff0c;一番摸索之后&#xff0c;把成果在这里做个分享。 我把行情抓取的部分&#xff0c;和一个写手记的小功能&#xff0c;单独拿了出来放在一个小系统里面&#xff0c;可以…

人像摄影笔记(自用)

相机的原理&#xff1a;镜头--CMOS传感器---通过ISP的计算 然后通过手机的GPU处理后呈现出图片的形式 镜头&#xff1a;定焦和变焦&#xff0c;变焦分为光学变焦和数字变焦 光学变焦&#xff1a;焦距变了 画质不变 数字变焦&#xff1a;焦距不变 裁剪画质 数字变焦一…

前端埋点与监控最佳实践:从基础到全流程实现.

前端埋点与监控最佳实践&#xff1a;从基础到全流程实现 大纲 我们会从以下三个方向来讲解埋点与监控的知识&#xff1a; 什么是埋点&#xff1f;什么是监控&#xff1f; JS 中实现监控的核心方案 写一个“相对”完整的监控实例 一、什么是埋点&#xff1f;什么是监控&am…

电能质量治理产品在分布式光伏电站的应用

1.概述 随着全球对可再生能源需求的不断增长&#xff0c;分布式光伏电站的建设与扩张正迅速发展。然而&#xff0c;在其运行过程中&#xff0c;分布式光伏电站遭遇了一系列挑战&#xff0c;包括企业关口计量点功率因数降低和谐波污染等问题。这些问题不仅影响了光伏电站的运行…

遥感图像Trento原始数据集下载

遥感图像Trento原始数据集下载 偶然间在某个项目里发现了Trento的完整数据集&#xff0c;不过那个数据集有些奇怪的小改动 虽然我已经不做遥感方向了&#xff0c;不过当初我找这个数据集也是花了很长时间 于是重新整理了一下&#xff0c;就当是方便后来的研究者使用吧 githu…