using System; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace ypp.tests { [TestClass] public class AysncTest { [TestMethod] public void TestMethod1() { Console.WriteLine("testStart:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm ss")); var xx = GetNick(); Console.WriteLine("testEnd:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm ss")); //xx(); } public async Task<string> GetNick() { return await Task.Run(() => { //等待10秒 System.Threading.Thread.Sleep(1000 * 10); var strNow = DateTime.Now.ToString("yyyy-MM-dd HH:mm ss"); Console.WriteLine("NotifyChange:" + strNow); return strNow; }); } } }
输出结果:
简单说明:
1. async 用来标记 该方式是否 支持异步( 如果方法体内没有 await 的话,则和正常同步方法一样),方法体内要有 await才能起到 异步效果 await==async wait
2. 当这么写的时候 会忽略异步 直接同步执行
[TestMethod] public void TestMethod1() { Console.WriteLine("testStart:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm ss")); var xx = GetNick().Result; Console.WriteLine("testEnd:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm ss")); //xx(); }
从逐渐剖析Async中发现,Net提供的异步方式基本上一脉相承的,如:
1. net4.5的Async,抛去语法糖就是Net4.0的Task+状态机。
2. net4.0的Task, 退化到3.5即是(Thread、ThreadPool)+实现的等待、取消等API操作。