在提到异步之前,不可避免的需要了解一下进程和线程,接下来一步步进行了解
一:进程,线程的概念
进程是系统进行资源分配和调度的单位;线程是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.异步执行时无序的,随机的