目录
1.异步定义
异步程序中,程序代码不需要按照编写时的顺序严格执行。为了改善代码性能,有时需要在一个新的线程中运行一部分代码,有时无需创建新的线程,但为了更好的利用单个线程的能力,需要改变代码的执行顺序。
简而言之:异步编程提供代码的非顺序执行能力。让程序能够在部分耗时操作的同时,干其它的事情。
2.async/await构建异步方法
async/await构建异步方法是C# 5.0引入的新特性。是几种异步方法中最简练的一种。
2.1直观认识
示例代码:
//异步操作示例类
using System;
using System.Threading.Tasks;
using System.Net;
using System.Diagnostics;
namespace ASyncTest
{
class MyDownloadString
{
Stopwatch st = new Stopwatch();
Stopwatch st1 = new Stopwatch();
/// <summary>
/// 普通方式
/// </summary>
public void DoRun()
{
const int LargeNum = 600000;
st.Start();
int t1 = CountCharacters(1, "http://www.microsoft.com");
int t2 = CountCharacters(2, "http://www.csdn.net");
CountToALargeNumber(1, LargeNum);
CountToALargeNumber(2, LargeNum);
CountToALargeNumber(3, LargeNum);
CountToALargeNumber(4, LargeNum);
Console.WriteLine("http://www.microsoft.com 网站字符数:{0}", t1);
Console.WriteLine("http://www.csdn.net 网站字符数:{0}", t2);
st.Stop();
}
/// <summary>
/// 异步方式
/// </summary>
public void DoRunAsync()
{
const int LargeNum = 600000;
st1.Start();
Task<int> t1 = CountCharactersAnSyn(1, "http://www.microsoft.com");
Task<int> t2 = CountCharactersAnSyn(2, "http://www.csdn.net");
CountToALargeNumber2(1, LargeNum);
CountToALargeNumber2(2, LargeNum);
CountToALargeNumber2(3, LargeNum);
CountToALargeNumber2(4, LargeNum);
Console.WriteLine("http://www.microsoft.com 网站字符数:{0}", t1.Result);
Console.WriteLine("http://www.csdn.net 网站字符数:{0}", t2.Result);
}
private void CountToALargeNumber(int id, int largeNum)
{
for (long i = 0; i < largeNum; i++)
{ }
Console.WriteLine(" 结束计数ID{0}: {1,4:N0}ms", id, st.Elapsed.TotalMilliseconds);
}
private int CountCharacters(int id, string uriString)
{
WebClient wc1 = new WebClient();
Cons