1、同步代码
代码语言:javascript复制class Program
{
static void Main(string[] args)
{
Console.WriteLine($"当前线程Id:{Thread.CurrentThread.ManagedThreadId}");
var watch = Stopwatch.StartNew();
CookRice();
Console.WriteLine("饭煮好了");
CookDish();
Console.WriteLine("菜煮好了");
DoLaundry();
Console.WriteLine("衣服洗好了");
watch.Stop();
Console.WriteLine($"总耗时:{watch.ElapsedMilliseconds}毫秒");
Console.WriteLine($"当前线程Id:{Thread.CurrentThread.ManagedThreadId}");
Console.ReadKey();
}
/// <summary>
/// 煮饭
/// </summary>
static void CookRice()
{
Console.WriteLine("开始煮饭");
Task.Delay(3000).Wait();
}
/// <summary>
/// 做菜
/// </summary>
static void CookDish()
{
Console.WriteLine("开始做菜");
Task.Delay(2000).Wait();
}
/// <summary>
/// 洗衣服
/// </summary>
static void DoLaundry()
{
Console.WriteLine("开始洗衣服");
Task.Delay(3000).Wait();
}
}
标准的同步代码,Wait方法会阻塞当前现成的执行,知道之前的方法执行完毕.
2、异步代码
代码语言:javascript复制 class Program
{
static async Task Main(string[] args)
{
Console.WriteLine($"当前线程Id:{Thread.CurrentThread.ManagedThreadId}");
var watch = Stopwatch.StartNew();
await CookRice();
Console.WriteLine("饭煮好了");
await CookDish();
Console.WriteLine("菜煮好了");
await DoLaundry();
Console.WriteLine("衣服洗好了");
watch.Stop();
Console.WriteLine($"总耗时:{watch.ElapsedMilliseconds}毫秒");
Console.WriteLine($"当前线程Id:{Thread.CurrentThread.ManagedThreadId}");
Console.ReadKey();
}
/// <summary>
/// 煮饭
/// </summary>
static async Task CookRice()
{
Console.WriteLine("开始煮饭");
await Task.Delay(3000);
}
/// <summary>
/// 做菜
/// </summary>
static async Task CookDish()
{
Console.WriteLine("开始做菜");
await Task.Delay(2000);
}
/// <summary>
/// 洗衣服
/// </summary>
static async Task DoLaundry()
{
Console.WriteLine("开始洗衣服");
await Task.Delay(3000);
}
}
3、简要分析
到这里发现同步和异步的程序执行时间是一样的,说明async 和 await下的异步编程执行看起来是"同步的",当然它的原理不是同步的,是"通知机制",具体自行百度.两者唯一的区别就是看似同步的异步代码,却被两个线程处理过了.这从侧面反映了异步代码能提升Cpu利用率,虽然执行时间没有改变.如果单单只有这点,那异步会显得比较鸡肋,接着看下面的例子,因为2中的代码没有启动异步的一些关键功能.