菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

core 异步多线程

5879人阅读 2021/12/20 11:38 总访问:1019596 评论:0 收藏:0 手机
分类: 多线程

前言

同步异步编程

同步编程是对于单线程来说的,就像我们编写的控制台程序,以main方法为入口,顺序执行我们编写的代码。
异步编程是对于多线程来说的,通过创建不同线程来实现多个任务的并行执行。

多线程在.net core 和.net framework  中应用十分广泛,比如你想做一个下载功能,单线程必须得等你下载结束过后才能进行其他操作,万一下载的东西几个G,那你的程序就几十分钟甚至几个小时不能进行操作,这样是十分不科学的。
开启多个线程就可以很好的解决这个问题,不仅可以在下载的同时进行其他操作,而且还可以做出进度条????甚至可以同时下载多个文件,开启多个进度条。

线程

.Net 1.0就发布了System.Threading,其中提供了许多类型(比如Thread、ThreadStart等)可以显示的创建线程。

主线程

每一个Windows进程都恰好包含一个用作程序入口点的主线程。进程的入口点创建的第一个线程被称为主线程。.Net执行程序(控制台、Windows Form、Wpf等)使用Main()方法作为程序入口点。当调用该方法时,主线程被创建。


子线程

由主线程创建的线程,可以称为工作者线程,用来去执行某项具体的任务。


前台线程

默认情况下,使用Thread.Start()方法创建的线程都是前台线程。前台线程能阻止应用程序的终结,只有所有的前台线程执行完毕,CLR才能关闭应用程序(即卸载承载的应用程序域)。前台线程也属于工作者线程。



后台线程

后台线程不会影响应用程序的终结,当所有前台线程执行完毕后,后台线程无论是否执行完毕,都会被终结。一般后台线程用来做些无关紧要的任务(比如邮箱每隔一段时间就去检查下邮件,天气应用每隔一段时间去更新天气)。后台线程也属于工作者线程。

计算机概念

什么是进程?
程序在计算机上执行,占据的计算机资源合集,称之为进程。
多个线程之间不会互相干扰,但是进程之间的通信比较困难(分布式)

什么是线程?
程序执行的最小单位,响应操作的最小执行流,线程包含自己的计算资源,线程是属于进程的,没有进程也就没有线程,一个进程可以有多个线程

什么是多线程?
一个进程中有多个线程并发执行

C#概念

多线程   Thread   实际上也是一个类
是.net framework 对线程线程对象的抽象封装
通过Thread完成的操作实际上是通过向操作系统请求得到的执行流
CurrentThread :当前线程
ManagedThreadID :是.net平台给Thread起的一个名字

常用方法

  1. //主线程入口
  2.         static void Main(string[] args)
  3.         {
  4.             Console.WriteLine("主线程开始!");
  5.             //创建前台工作线程
  6.             Thread t1 = new Thread(Task1);
  7.             t1.Start();
  8.             //创建后台工作线程
  9.             Thread t2 = new Thread(new ParameterizedThreadStart(Task2));
  10.             t2.IsBackground = true;//设置为后台线程
  11.             t2.Start("传参");
  12.         }
  13.         private static void Task1()
  14.         {
  15.             Thread.Sleep(1000);//模拟耗时操作,睡眠1s
  16.             Console.WriteLine("前台线程被调用!");
  17.         }
  18.         private static void Task2(object data)
  19.         {
  20.             Thread.Sleep(2000);//模拟耗时操作,睡眠2s
  21.             Console.WriteLine("后台线程被调用!" + data);
  22.         }


执行发现,【后台线程被调用】将不会显示。因为当所有的前台线程执行完毕后,应用程序就关闭了,不会等待所有的后台线程执行完毕,所以不会显示。

创建线程

  1. static void Main(){
  2.     new Thread(Go).Start();  // .NET 1.0开始就有的
  3.     Task.Factory.StartNew(Go); // .NET 4.0 引入了 TPL
  4.     Task.Run(new Action(Go)); // .NET 4.5 新增了一个Run的方法
  5.     }
  6.  public static void Go(){
  7.     Console.WriteLine("我是另一个线程");
  8.     }

创建Thread的实例之后,需要手动调用它的Start方法将其启动。但是对于Task来说,StartNew和Run的同时,既会创建新的线程,并且会立即启动它。

线程池

线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率,这也是线程池的主要好处。
ThreadPool适用于并发运行若干个任务且运行时间不长且互不干扰的场景。
还有一点需要注意,通过线程池创建的任务是后台任务。
线程的创建是比较占用资源的一件事情,.NET 为我们提供了线程池来帮助我们创建和管理线程。Task是默认会直接使用线程池,但是Thread不会。如果我们不使用Task,又想用线程池的话,可以使用ThreadPool类。

  1. static void Main() {
  2.     Console.WriteLine("我是主线程:Thread Id {0}", Thread.CurrentThread.ManagedThreadId);
  3.     ThreadPool.QueueUserWorkItem(Go);
  4.  
  5.     Console.ReadLine();}
  6.  public static void Go(object data) {
  7.     Console.WriteLine("我是另一个线程:Thread Id {0}",Thread.CurrentThread.ManagedThreadId);}

返回值

Task可以有返回值。

  1. static void Main() {
  2.     // GetDayOfThisWeek 运行在另外一个线程中
  3.     var dayName = Task.Run<string>(() => { return GetDayOfThisWeek(); });
  4.     Console.WriteLine("今天是:{0}",dayName.Result);
  5. }


作者:GongZH丶
链接:https://www.jianshu.com/p/cd8e3d39116e
来源:简书

评价

NET core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.NET core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

Net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...

NET core项目结构简单分析

一:wwwrootwwwroot用于存放网站的静态资源,例如css,js,图片与相关的前端插件等lib主要是第三方的插件,例如微软默认引用...

Net core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

.net core使用requestresponse下载文件下载excel等

使用request获取内容net core中request没有直接的索引方法,需要点里边的Query,或者formstringbase64=Request.Form[&quot;f...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错其实仔细看他的错误提示,其...

net core中使用url编码与解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

下载net core

官方下载地址:https://dotnet.microsoft.com/download 进来之后就可以看到最新的下载版本可以直接点击下载,也可以下载其...

Net core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...