using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp2 { class Program { static void Main(string[] args) { Console.WriteLine("我是主线程,线程ID:" + Thread.CurrentThread.ManagedThreadId); ////task用法一 //Task task1 = new Task(() => MyAction());//异步调用任务 //task1.Start(); //Console.WriteLine("***"); ////task用法二 //var strRes = Task.Run(() => { return GetReturnStr(); });//同步等待返回值 //Console.WriteLine(strRes.Result); //task->async异步方法和await,主线程碰到await时会立即返回,继续以非阻塞形式执行主线程下面的逻辑 Console.WriteLine("---------------------------------"); Console.WriteLine("①我是主线程,线程ID:{0}", Thread.CurrentThread.ManagedThreadId); var testResult = TestAsync(); Console.WriteLine("@@@@@@@@@@"); //Console.WriteLine("Main_1:{0}", Thread.CurrentThread.ManagedThreadId); //A(); //Console.WriteLine("Main_2{0}", Thread.CurrentThread.ManagedThreadId); Console.ReadKey(); } static async Task A() { Console.WriteLine("1线程ID:{0}", Thread.CurrentThread.ManagedThreadId); B(); Console.WriteLine("1线程ID:{0}", Thread.CurrentThread.ManagedThreadId); } static async Task B() { Thread.Sleep(1000); Console.WriteLine("2线程ID:{0}", Thread.CurrentThread.ManagedThreadId); } static async Task TestAsync() { Console.WriteLine("②调用GetReturnResult()之前,线程ID:{0}。当前时间:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); var name = GetReturnResult(); Console.WriteLine("④调用GetReturnResult()之后,线程ID:{0}。当前时间:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); Console.WriteLine("⑥得到GetReturnResult()方法的结果一:{0}。当前时间:{1}", await name, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); Console.WriteLine("⑥得到GetReturnResult()方法的结果二:{0}。当前时间:{1}", name.GetAwaiter().GetResult(), DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); } static async Task GetReturnResult() { Thread.Sleep(2000); Console.WriteLine("③执行Task.Run之前, 线程ID:{0}", Thread.CurrentThread.ManagedThreadId); return await Task.Run(() => { Thread.Sleep(2000); Console.WriteLine("⑤GetReturnResult()方法里面线程ID: {0}", Thread.CurrentThread.ManagedThreadId); return "我是返回值"; }); } static void MyAction() { Console.WriteLine("1我是新进程,线程ID:" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); Console.WriteLine("2我是新进程,线程ID:" + Thread.CurrentThread.ManagedThreadId); } static string GetReturnStr() { Thread.Sleep(2000); return "我是返回值,线程ID:" + Thread.CurrentThread.ManagedThreadId; } } }