异步初体验

在提到异步之前,不可避免的需要了解一下进程和线程,接下来一步步进行了解

一:进程,线程的概念

进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位

一个进程可以有多个线程,这些线程共享这个进程的资源

可能上面的概念不太能理解到,接下来请打开你电脑的任务管理器,我们的电脑同时可以进行多项操作,你可以同时登QQ听歌敲代码,这些都是一个个进程

那一个进程可以有多个线程,比如Google你一个浏览器可以开多个窗口,同时进行搜索,在任务管理器也可以看到,线程的数量要远远大于进程的数量

二:同步,异步的概念

同步:

同步的思想是:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭了,即迁移程序就中断了。

异步:

将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序再慢慢地去写入数据库去。这就是异步。但是用户没有卡死的感觉,会告诉你,你的请求系统已经响应了。你可以关闭界面了。

三:委托 BeginInvoke 异步调用(同步异步对比)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //定义一个委托
        private delegate void example(string name, string project);
 

        private void button2_Click(object sender, EventArgs e)
        {
            Console.WriteLine("***********************************异步开始***********************************");
            example ex = new example(loding);
            for (int i = 0; i < 5; i++)
            {
                var name = string.Format("异步{0}", i);
                ex.BeginInvoke(name, "异步", null, null);
            }
            Console.WriteLine("***********************************异步结束***********************************");
        }

        private void button3_Click(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("***********************************同步开始***********************************");
            example ex = new example(loding);

            for (int i = 0; i < 5; i++)
            {
                var name = string.Format("同步{0}", i);
                ex.Invoke(name, "同步");

            }
            Console.WriteLine("***********************************同步结束***********************************");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
         
        }

        private static void loding(string name, string project)
        {
            Console.WriteLine("这里是{0}开始执行{1},这里是线程{2}", name, project, Thread.CurrentThread.ManagedThreadId); ;
            long result = 0;
            for (int i = 0; i < 1000000; i++)
            {
                result += i;
            }
            Thread.Sleep(2000);//等待2s
            Console.WriteLine("这里是{0}结束执行,这里是线程{1},计算结果为{2}", name, Thread.CurrentThread.ManagedThreadId, result); ;
        }
    }
}

using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //定义一个委托
        private delegate void example(string name, string project);

        private void button2_Click(object sender, EventArgs e)
        {
            Console.WriteLine("***********************************异步开始***********************************");
            example ex = new example(loding);
            ex.BeginInvoke("szh", "异步", null, null);
            Console.WriteLine("***********************************异步结束***********************************");
        }

        private void button3_Click(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("***********************************同步开始***********************************");
            example ex = new example(loding);
            ex.Invoke("szh", "同步");
            Console.WriteLine("***********************************同步结束***********************************");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
         
        }

        private static void loding(string name, string project)
        {
            Console.WriteLine("这里是{0}开始执行{1},这里是线程{2}", name, project, Thread.CurrentThread.ManagedThreadId); ;
            long result = 0;
            for (int i = 0; i < 1000000; i++)
            {
                result += i;
            }
            Thread.Sleep(2000);//等待2s
            Console.WriteLine("这里是{0}结束执行,这里是线程{1},计算结果为{2}", name, Thread.CurrentThread.ManagedThreadId, result); ;
        }
    }
}

此时运行程序点击同步,这时候会发现 1.在方法没有执行完成的时候,移动我的窗体文件会显示“未响应”,只有当显示“同步结束”之后才可以移动。(这是因为同步一直占用主程序)2.所有使用的线程全都是1

接下来点击异步按钮,发现

1.窗口是可以一直移动的 2.方法的执行顺序貌似不是按照我想要的顺序在走 3 .会有多个线程,且开始线程的顺序和结束的顺序都可能变化

调用的同样的方法,只是一个是同步,一个是异步,执行出来的结果顺序却不一样

由此得出异步的三个特点

1.同步一直使用主线程,会出现程序卡顿的状态(因为他在做这件事的时候,无法去做其他的),而异步启用了多个线程,主线程没有被占用

2.异步的响应速度快,但耗资源(这点可以在进行异步调用的时候,查看你电脑的CPU峰值)

3.异步执行时无序的,随机的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值