C#沉淀-异步编程 一

本文介绍了C#中的异步编程,通过示例对比了同步与异步执行的效率,详细讲解了async/await特性的结构,异步方法的语法,以及如何取消异步操作。异步编程能有效提高程序运行效率,避免长时间阻塞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是异步

任务以固定的顺序被执行叫做同步,任务不按固定顺序执行则叫做异步

关于进程与线程

启动程序时,系统会在内存中创建一个新进程

进程是构成运行程序的资源的集合

这些资源包括虚地址空间、文件句柄和许多其他程序运行所需的东西

在进程内部,系统创建了一个称为线程的内核对象,它代表了真正执行的程序

Main方法是程序的入口,在这里,程序会开始线程的执行

要点:

  • 默认情况下,一个进程只包含一个线程从程序的开始一直执行到程序的结束
  • 线程可以派生其他线程,因此在任意时刻,一个进程都可以包含不同状态的多个线程,来执行程序的不同任务
  • 如果一个进程拥有多个线程,它们将共享进程的资源
  • 系统为处理器执行所规划的单元是线程,不是进程

示例一,不使用异步:

using System;
using System.Net;
using System.Diagnostics;

namespace CodeForAsync
{
   
   
    class MyDownloadString
    {
   
   
        //Stopwatch类可以用来计算资源耗时
        Stopwatch sw = new Stopwatch();

        public void DoRun()
        {
   
   
            const int LargeNumber = 6000000;
            sw.Start();//启动计时
			
            //调用两次下载资源的方法,测算时间消耗
            //下载百度资源
            int t1 = CountCharacters(1, "http://baidu.com");
            //下载搜狗资源
            int t2 = CountCharacters(2, "https://pinyin.sogou.com/");
            
            //调用四次循环方法,测算时间消耗
            CountToALargeNumber(1, LargeNumber);
            CountToALargeNumber(2, LargeNumber);
            CountToALargeNumber(3, LargeNumber);
            CountToALargeNumber(4, LargeNumber);

        }

        //下载网站资源
        private int CountCharacters(int id, string uristring)
        {
   
   
            //实例化一个WebClient对象,用于网站交互
            WebClient wc1 = new WebClient();
            Console.WriteLine("下载{0}开始运行 - 时间节点:{1} ms", id, sw.Elapsed.TotalMilliseconds);//sw.Elapsed.TotalMilliseconds表示一个毫秒级的时间跨度值

            //将请求资源下载为string格式
            string result = wc1.DownloadString(new Uri(uristring));
            Console.WriteLine("\t下载{0}运行结束 - 时间节点:{1} ms", id, sw.Elapsed.TotalMilliseconds);

            return result.Length;
        }

        //循环指定次数,不做任何操作
        private void CountToALargeNumber(int id, int value)
        {
   
   
            for (long i = 0; i < value; i++);
            Console.WriteLine("循环{0}运行结束 - 时间节点:{1} ms", id, sw.Elapsed.TotalMilliseconds);
        }
    }
    class Program
    {
   
   
        static void Main(string[] args)
        {
   
   
            MyDownloadString ds = new MyDownloadString();
            ds.DoRun();

            Console.ReadKey();
        }
    }
}

运行结果:

下载1开始运行 - 时间节点:2.1404 ms
        下载1运行结束 - 时间节点:413.6084 ms
下载2开始运行 - 时间节点:413.7037 ms
        下载2运行结束 - 时间节点:927.1802 ms
循环1运行结束 - 时间节点:949.9849 ms
循环2运行结束 - 时间节点:973.1916 ms
循环3运行结束 - 时间节点:995.1234 ms
循环4运行结束 - 时间节点:1017.0343 ms

从上例可以看出,执行的顺序是:下载1开始-下载1结束》下载2开始-下载2结束》循环1》循环2》循环3》循环4;它们的执行是有序的,如果上一步的任务未执行完毕,下一个任务是无法开始的

这里的循环并未消耗多少时间,而从网站下载资源的两个任务都消耗了比较多的资源,也就是说,在程序运行期间,所有的任务都会被这两个下载任务拖慢进度

示例二:使用异步

using System
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值