最近在學習.net4.5推出的基於任務的異步模式的學習,記錄部分筆記以便日後回顧:
上代碼:
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp5
{
class Program
{
static void Main(string[] args)
{
Print();
Console.WriteLine("返回主線程");
Thread.Sleep(150200);//這段代碼是必須的,模擬前臺線程一直在工作因爲異步開啓的是後臺線程,如果main的主線程退出,後臺線程會自動退出
}
public static async void Print()//供調用方調用的異步方法:
{
Console.WriteLine(" print begin");
string s = await OutPut();
Console.WriteLine("呵呵");
await DoSomeThing();
Console.WriteLine(s);
}
public static Task<string> OutPut()//任務方法(帶有返回值)
{
Task<string> task = new Task<string>(() => { Thread.Sleep(5000);Console.WriteLine("Output OK"); return "simon"; });
task.Start();
return task;
}
public static Task DoSomeThing()//任務方法(不帶返回值)
{
var task= new Task(() => { Thread.Sleep(3000); Console.WriteLine("DoSomeThing OK"); });
task.Start();
return task;
}
//要點:
//異步方法是指可通過await關鍵字將線程的控制權還給調用方從而實現調用方不被阻塞而任務方法也可以同時執行的方法,由此實現異步,可以認爲是在調用方和任務方法直接加的一個具有異步能力中間層。
//這裏涉及到三個角色方法:異步方法調用方;帶有async/await的異步方法;異步方法內await後跟的返回Task的任務方法
//三個方法內部都是同步執行的,例如上的Print方法內部一定是同步執行,只是通過await實現調用方Main的異步(以前一直以爲異步方法是其本身可以異步)
}
}