分享

C#中Task任务和Async、Await异步非阻塞方式

 瓜瓜2uuq7332fe 2018-05-23
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading;  
  6. using System.Threading.Tasks;  
  7.   
  8. namespace TaskSample  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             Console.WriteLine("我是主线程,线程ID:" + Thread.CurrentThread.ManagedThreadId);  
  15.             //task用法一  
  16.             Task task1 = new Task(() => MyAction());  
  17.             task1.Start();  
  18.   
  19.             //task用法二  
  20.             var strRes = Task.Run<string>(() => { return GetReturnStr(); });  
  21.             Console.WriteLine(strRes.Result);  
  22.   
  23.             //task->async异步方法和await,主线程碰到await时会立即返回,继续以非阻塞形式执行主线程下面的逻辑  
  24.             Console.WriteLine("---------------------------------");  
  25.             Console.WriteLine("①我是主线程,线程ID:{0}", Thread.CurrentThread.ManagedThreadId);  
  26.             var testResult = TestAsync();  
  27.             Console.ReadKey();  
  28.         }  
  29.   
  30.         static async Task TestAsync()  
  31.         {  
  32.             Console.WriteLine("②调用GetReturnResult()之前,线程ID:{0}。当前时间:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));  
  33.             var name = GetReturnResult();  
  34.             Console.WriteLine("④调用GetReturnResult()之后,线程ID:{0}。当前时间:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));  
  35.             Console.WriteLine("⑥得到GetReturnResult()方法的结果一:{0}。当前时间:{1}", await name, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));  
  36.             Console.WriteLine("⑥得到GetReturnResult()方法的结果二:{0}。当前时间:{1}", name.GetAwaiter().GetResult(), DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"));  
  37.         }  
  38.   
  39.         static async Task<string> GetReturnResult()  
  40.         {  
  41.             Console.WriteLine("③执行Task.Run之前, 线程ID:{0}", Thread.CurrentThread.ManagedThreadId);  
  42.             return await Task.Run(() =>  
  43.             {  
  44.                 Thread.Sleep(2000);  
  45.                 Console.WriteLine("⑤GetReturnResult()方法里面线程ID: {0}", Thread.CurrentThread.ManagedThreadId);  
  46.                 return "我是返回值";  
  47.             });  
  48.         }  
  49.   
  50.         static void MyAction()  
  51.         {  
  52.             Console.WriteLine("我是新进程,线程ID:" + Thread.CurrentThread.ManagedThreadId);  
  53.         }  
  54.   
  55.         static string GetReturnStr()  
  56.         {  
  57.             return "我是返回值,线程ID:" + Thread.CurrentThread.ManagedThreadId;  
  58.         }  
  59.     }  
  60. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多