1.最簡單的非同步運行class Program { static void Main(string [] args) { Task.Run(() => { // Task能這麼靈活,也是因為有了Lambda呀。 Console.WriteLine("我是另一個線程:Thread Id {0}", T... ...
1.最簡單的非同步運行
class Program { static void Main(string [] args) { Task.Run(() => { // Task能這麼靈活,也是因為有了Lambda呀。 Console.WriteLine("我是另一個線程:Thread Id {0}", Thread.CurrentThread.ManagedThreadId); }); Console.ReadLine(); } }
結果:
創建線程不是一件容易的事情,所以這個方法自動採用了線程池的方式。
2.非同步方法要接收傳入的參數?上圖!
3.有了參數當然要有返回值
4.線程安全?
線程安全就是咱們都同時上班(非同步互不打擾),但是印表機只有一臺(競態資源),就會出現搶資源的節奏嗎,不能我列印一半後另一半出現的是別人要列印的文檔,就會出現最終數據和預期不一致了,那簡單,我用的時候把門鎖上!
那有的人又說了,我印表機有3台啊,你用一臺,你鎖什麼門?那就用這個叫SemaphoreSlim 的東西吧
5.線程裡面的程式報異常了怎麼說?
用task.wait(),讓線程在這個try中執行完,才能獲取到他的異常,不wait的話主線程都執行出try,你子線程報的錯,我還理你個毛!另外這個要用ex的innetexception才能獲取到真正的原始異常信息,不然獲取到的是包裝過的異常信息。
6.快捷方式 async & await
這倆東西實際上是對task的一次封裝,就這個例子,好好體會一下什麼都會了!註意 await 方法後面始終跟task,所以這個async的方法也返回task,供其他方法內用await調用,不用想太多,照著寫沒出問題就行。
換用GetAwaiter().GetResult()的方式發現區別了沒?上面的線程ID是10,10,10,6,6,換姿勢後是99699,套路有點區別!簡單來說GetAwaiter().GetResult()就是開的以獨立線程,執行完就釋放了,await不同是開的獨立線程執行完之前的線程釋放了,之後的代碼由這個線程繼續處理,不過沒啥區別,反正GetAwaiter().GetResult() 就是await的原始方式,一樣的東西
7.關於asp.net中的async action。為啥要這樣。
如果不用async action 那就一個線程處理一個請求唄,請求完了線程才釋放,用了async action 一個線程處理這個請求馬上可以接受其他請求,因為裡面的具體邏輯交給其他線程了,當然實際可能沒這個簡單,意思是這個意思明白就行了。