iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#中异步多线程的示例分析
  • 777
分享到

C#中异步多线程的示例分析

2023-06-25 16:06:33 777人浏览 泡泡鱼
摘要

这篇文章主要介绍C#中异步多线程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!进程、线程1. 进程首先了解,什么是线程? 即一个应用程序运行时,占用资源的综合是一个进程。windows 任务管理器里面可以看

这篇文章主要介绍C#中异步多线程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

进程、线程

1. 进程

首先了解,什么是线程? 即一个应用程序运行时,占用资源的综合是一个进程。windows 任务管理器里面可以看到,里面一个个都是在运行的进程。

C#中异步多线程的示例分析

2. 线程

线程是执行流的最小单位。线程其实是看不到的,其实也可以,例如 Windows 任务管理器:正在运行 272 个进程,272 个进程运行了 3909 个线程,也就是一个进程可以拥有多个线程。

C#中异步多线程的示例分析

分时、分片

现在有个怪相,CPU 实在太快了,内存显卡其他硬件资源其实都跟不上 CPU 的速度,于是就产生了分片的概念。从微观角度来讲,以前电脑很多都是单核,一时刻只能执行一个线程,按照这个道理,为什么我们的计算机还可以同时运行许多个应用呢。但从宏观来说是并发的,多个应用同时执行,我们既可以扫雷也可以完蜘蛛纸牌还可以听音乐。这就是分片,分片会产生一个上下文,假设当前执行扫雷线程,下一个时刻执行蜘蛛纸牌线程,CPU 会将扫雷线程上下文保存起来,切换成蜘蛛纸牌线程,这样进行来回调度,从宏观来看是并发的。

这个补充一点额外知识,多 CPU 多核,本身就可以完成多个线程的计算,可以独立工作。4核8线程,核就是物理的核,线程是虚拟的核,每个核可以进行分片做并发的。

同步、异步

我们开发人员口中常说的同步、异步,其实是对方法执行的描述。因为编程语言本身是没有线程的,它只能去向操作系统申请线程,去执行代码。

同步方法,代码执行第一行到最后一行依次执行到结束,完成第一行之后进入下第二行直到最后一行,这就是同步,阻塞式的。

异步方法,不会等待当前行执行完成,就会进行下一行执行代码,非阻塞式的。

异步、多线程

多线程,就是多个执行流,同时执行。在 C# 中多线程就是多个并发的 Thread 开启多个线程处理任务,利用的可能是 CPU 的多核,也可能是单核 CPU 分片完成执行的任务。

异步,其实是硬件式的异步,其实这个不太好理解。这里就拿文件写入来说

多线程情况,线程会一直从文件写入开始到结束,都参与工作这件事,也就是 CPU 会处理写文件操作,线程会一直等待 CPU 向磁盘写入文件直到完成。

异步情况,线程会给 CPU 发个指令与文件流交个操作系统,线程就可以忙别的事情去了,也就是利用硬件的特性,发个指令让操作系统完成文件写入,线程去执行其他任务,等 CPU 写完后发个指令回来,通知到线程。

有同学会问这个异步怎么写,其实在程序中是写不了这个的,这是操作系统底层的东西,在 WPF 里面就可以直接调用。 C# 中常说的异步多线程指的是 ThreadPool、Task ,都是基于 Thread 完成的,只是 C# 语言进行了封装的。

异步多线程效率

说起异步很多人都知道,同步方法慢,异步多线程快,这个大家心里面都是这么认为的。但效率究竟提升了多少呢

我们看下面程序,定义一个普通方法 Sum 做些 CPU 密集型运算,然后在 Main 方法,分别同步与异步,执行 Sum 方法。即同样的任务使用单线程(主线程)运行五次,再使用多线程开启 5 个线程,分别执行。

public static void Sum(int f){    Console.WriteLine($"第{f}次  start:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");    decimal s = 0;    for (int i = 0; i < 1000000000; i++)    {        s = s + i;    }    Console.WriteLine($"第{f}次  end:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");}static void Main(string[] args){    Console.WriteLine($"同步 start:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");    for (int i = 0; i < 5; i++)    {        Sum(i);    }    Console.WriteLine($"同步 end:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");    Console.WriteLine();    Console.WriteLine($"异步 start:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");    for (int i = 0; i < 5; i++)    {        Action<int> action = Sum;        action.BeginInvoke(i,null,null);    }    Console.WriteLine($"异步 end:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");    Console.ReadKey();}

C#中异步多线程的示例分析

启动程序,可以看到,同步方法1个线程执行了 2 分 40 秒,异步方法 5 个线程执行了 52 秒,很显然异步方法快与同步方法四倍多。

C#中异步多线程的示例分析

说到这可能有的同学会发现,同步1个线程,异步5个线程,为什么效率不提升五倍呢,不是线性增长呢?其实,异步效率提升受限于资源限制、上下文切换成本

上面我们说过 CPU 的分时分片,即使单核也可以同时运行多个程序,那既要马儿跑得快,又要马儿不吃草,怎么可能呢,这就是上下文切换的管理成本。

资源限制,异步效率不高也可能资源不够。如下,我们启动资源管理器并启动程序,可以看到同步时 CPU 使用的资源并不高执行但时间长,当多线程时 CPU 达到了 100% 但执行时间短,也就是一种资源换时间策略。

C#中异步多线程的示例分析

多线程无序性

因为计算机的分时分片,会使得多线程无序。即启动无序、执行无序、结束无序。

启动无序,线程是操作系统的,C# 并没有线程,C# 需要向操作系统申请线程,假设同时或者有序向向操作系统申请线程,但操作系统并不是按顺序给线程,可能后申请的先拿到线程,也可能先申请的后拿到线程。

执行无序,程序拿到了操作系统分片的线程后,我们执行的任务运气好了可能后申请的先执行,运气差了先申请的后执行,都是非常常见的。

结束无序,这个受执行无序、分时分片运气、任务量的影响。开始执行无序已经说过;分时分片运气,当我的 CPU 执行一个任务,并不是任务执行完了才会进行上下文的切换去执行其他任务,而是可以随时暂停切换执行其他任务的;任务量就是,做的任务多少不同,即使同一时刻开始执行,完成的时间必然不一样。

以上是“C#中异步多线程的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: C#中异步多线程的示例分析

本文链接: https://www.lsjlt.com/news/306191.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中异步多线程的示例分析
    这篇文章主要介绍C#中异步多线程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!进程、线程1. 进程首先了解,什么是线程 即一个应用程序运行时,占用资源的综合是一个进程。Windows 任务管理器里面可以看到...
    99+
    2023-06-25
  • C#异步多线程中Thread的示例分析
    这篇文章给大家分享的是有关C#异步多线程中Thread的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Thread API这里对 Thread 的一些常用 API 进行介绍,使用一些案例进行说明。由于 T...
    99+
    2023-06-25
  • C#多线程中线程同步的示例分析
    这篇文章将为大家详细讲解有关C#多线程中线程同步的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言我们先来看下面一个例子:using System;using Syste...
    99+
    2023-06-29
  • c#中异步编程的示例分析
    这篇文章给大家分享的是有关c#中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么算异步?  广义来讲,两个工作流能同时进行就算异步,例如,CPU与外设之间的工作流就是异步的。在面向服务的系...
    99+
    2023-06-14
  • C#异步编程的示例分析
    小编给大家分享一下C#异步编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步编程在处理并发方面被使用的越来越多,之所以说上面一句话,是为了区分多线程...
    99+
    2023-06-17
  • JS中异步和单线程的示例分析
    这篇文章主要介绍了JS中异步和单线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。单线程但是我们在开发中,遇到请求网络,或者定时任务的时候,如果等待网络请求结束或者...
    99+
    2023-06-15
  • C#异步通信的示例分析
    这篇文章主要为大家展示了“C#异步通信的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#异步通信的示例分析”这篇文章吧。C#异步通信概念及应用的认识首先让我们来看看:在网络编程中运用S...
    99+
    2023-06-17
  • java中多线程的示例分析
    这篇文章主要介绍了java中多线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java多线程并发与并行:并行: 指两个或多个事件在同一时刻发生 ( 同时发生 ) ...
    99+
    2023-06-20
  • iOS中多线程的示例分析
    这篇文章给大家分享的是有关iOS中多线程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、iOS的三种多线程技术NSThread–优点:NSThread 比其他两个轻量级,使用简单–缺点:需要自己管理线...
    99+
    2023-06-21
  • JavaScript中异步编程的示例分析
    这篇文章给大家分享的是有关JavaScript中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目的提升开发效率,编写易维护的代码引子问题请求时候为什么页面卡死??$.ajax({ &n...
    99+
    2023-06-15
  • Promise中异步编程的示例分析
    这篇文章主要介绍Promise中异步编程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实例如下所示://1.解决异步回调问题 //1.1 如何同步异步请求 //如...
    99+
    2024-04-02
  • C++多线程中的线程同步与互斥量实例分析
    本篇内容介绍了“C++多线程中的线程同步与互斥量实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!线程同步#include &...
    99+
    2023-06-30
  • Java多线程同步问题的示例分析
    这篇文章主要介绍Java多线程同步问题的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!简单了解下在操作系统中进程和线程的区别:  进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开...
    99+
    2023-05-30
    java
  • Node.js中的异步编程的示例分析
    Node.js中的异步编程的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。异步编程概述曾经的单线程模型在...
    99+
    2024-04-02
  • JavaScript中异步的示例分析
    这篇文章将为大家详细讲解有关JavaScript中异步的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、异步解决方案的进化史JavaScript的异步操作一直是...
    99+
    2024-04-02
  • Python多线程的示例分析
    这篇文章将为大家详细讲解有关Python多线程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。线程相对进程来说是“轻量级”的,操作系统用较少的资源创建和管理线程。程序中的线程在相同的内存空间中执行...
    99+
    2023-06-17
  • Java程序中多线程的示例分析
    这篇文章主要介绍了Java程序中多线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  为什么会排队等待?  下面的这个简单的 Java 程序完成四项不相关的任务。...
    99+
    2023-06-03
  • python中asyncio异步编程的示例分析
    这篇文章将为大家详细讲解有关python中asyncio异步编程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.   想学asyncio,得先了解协程携程的意义:计算型的操...
    99+
    2023-06-14
  • Java多线程的示例分析
    这篇文章给大家分享的是有关Java多线程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。线程的创建继承Thread实现Runnable实现Callable使用继承Thread类来开发多线程的应用程序在设计...
    99+
    2023-06-20
  • C#多线程相关操作的示例分析
    这篇文章主要介绍了C#多线程相关操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、线程异常我们在单线程中,捕获异常可以使用try-catch,代码如下所示:us...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作