前言
前幾天去一個公司面試,被問到 Async/Await,之前只知道有這么個東西,沒有深入了解過就沒有答上來。今天沒啥事情,就查了下資料。
同步編程,異步編程概念
通常情況下,我們寫的程序是同步的,運行在同一個線程中,從程序的第一行代碼到最后一句按照順序執行。而異步編程的核心是使用多線程,通過讓不同的線程執行不同的任務,從而實現異步編程。
Thread & Task
.NET 4.0推出了新一代的多線程模型Task。async/await特性是與Task緊密相關的,所以在了解async/await前必須充分了解Task的使用。
Demo:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DemoAsync
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Task With Thread Start !");
for (int i = 0; i <= 5; i++)
{
Thread t = new Thread(Dotaskfunction);
t.Start();
}
Console.WriteLine("Task With Thread End !");
Console.WriteLine("Task With Task Start !");
for (int i = 0; i <= 5; i++)
{
Task.Run(() => { Dotaskfunction(); });
}
Console.WriteLine("Task With Task End !");
Console.ReadLine();
}
public static void Dotaskfunction()
{
Console.WriteLine("task has been done! ThreadID: {0},IsBackGround:{1} ", Thread.CurrentThread.ManagedThreadId,Thread .CurrentThread .IsBackground );
}
}
}
結果:
可以看到Thread方法每次的Thread Id都是不同的,而Task方法的Thread Id是重復出現的。我們知道線程的創建和銷毀是一個開銷比較大的操作,Task每次執行將不會立即創建一個新線程,而是到CLR線程池查看是 否有空閑的線程,有的話就取一個線程處理這個請求,處理完請求后再把線程放回線程池,這個線程也不會立即撤銷,而是設置為空閑狀態,可供線程池再次調度, 從而減少開銷。
Async/Await
其實也沒有什么神秘的,個人覺得就是實現異步主要靠await ,假如一個聲明為async的方法,沒有使用await關鍵字,則這個方法在執行的時候就被當作同步方法,這時編譯器也會拋出警告提示async修飾的方法中沒有使用await,將被作為同步方法使用。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace DemoAsync { class Program { static void Main(string[] args) { Console.WriteLine("Task Start !"); //DotaskWithThread(); DOTaskWithAsync(); Console.WriteLine("Task End !"); Console.ReadLine(); } public static async void DOTaskWithAsync() { Console.WriteLine("Await Taskfunction Start"); await Task.Run(()=> { Dotaskfunction(); }); } public static void Dotaskfunction() { for (int i = 0; i <= 5; i++) { Console.WriteLine("task {0} has been done!",i); } } } }
輸出:
也看到很多人使用task過程中會用到Task的泛型形式,這個還沒明白這樣用有啥用。 感覺像Demo 中這樣,我可以更好地理解,有人知道那個Task泛型使用的,可以留言討論。
本文為學習隨筆,如有錯誤,歡迎批評指正。