什么是异步
任务以固定的顺序被执行叫做同步,任务不按固定顺序执行则叫做异步
关于进程与线程
启动程序时,系统会在内存中创建一个新进程
进程是构成运行程序的资源的集合
这些资源包括虚地址空间、文件句柄和许多其他程序运行所需的东西
在进程内部,系统创建了一个称为线程的内核对象,它代表了真正执行的程序
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