如果指定使用 異步 或 異步 修飾符,方法是異步方法,可以實(shí)現(xiàn)以下兩個(gè)函數(shù)。
? 清單異步方法可以使用 Await 或指定的 等待 懸掛點(diǎn)。 等待運(yùn)算符通知編譯器異步方法不能繼續(xù)點(diǎn)的過(guò)去,直到等待的異步過(guò)程完成。 同時(shí),控制權(quán)交還異步方法的調(diào)用方。
一個(gè)異步方法的備用在等待表達(dá)式的不構(gòu)成從方法的退出,并且,finally 塊不會(huì)運(yùn)行。
? 清單異步方法本身可以通過(guò)調(diào)用它的方法等待。
異步方法通常包含等待運(yùn)算符的一個(gè)或多個(gè)匹配項(xiàng),但是,請(qǐng)假等待表達(dá)式不會(huì)導(dǎo)致編譯器錯(cuò)誤。 如果異步方法不會(huì)將等待運(yùn)算符指示懸掛點(diǎn),方法盡管"修飾符執(zhí)行,一個(gè)同步方法。 編譯器會(huì)發(fā)出此類(lèi)方法的警告。異步方法旨在成為非阻塞操作。 當(dāng)?shù)却娜蝿?wù)運(yùn)行時(shí),在異步方法的一個(gè)等待表達(dá)式不會(huì)阻止當(dāng)前線程。 相反,該表達(dá)式注冊(cè)該方法的其余部分作為繼續(xù)并返回控制對(duì)異步方法的調(diào)用方。
異步和等待關(guān)鍵字不會(huì)導(dǎo)致其他線程創(chuàng)建。 因?yàn)楫惒椒椒ū旧聿⒉粫?huì)運(yùn)行的線程,異步方法不需要多線程。 只有 + 當(dāng)方法處于活動(dòng)狀態(tài),則方法在當(dāng)前同步上下文中運(yùn)行并使用在線程的時(shí)間。 可以使用 Task.Run 移動(dòng) CPU 工作移到后臺(tái)線程,但是,后臺(tái)線程不利于等待結(jié)果變得可用處理。
以異步編程的基于異步的方法優(yōu)于于幾乎每個(gè)用例的現(xiàn)有方法。 具體而言,此方法比 IO 操作的 BackgroundWorker 好,因?yàn)榇a更為簡(jiǎn)單的,因此無(wú)需防止?fàn)幱脳l件。 與 Task.Run的組合,異步編程的 CPU 操作的 BackgroundWorker 好,因?yàn)楫惒骄幊虖?Task.Run 傳輸?shù)骄€程池的工作分隔運(yùn)行您的代碼以協(xié)調(diào)詳細(xì)信息。 ——MSDN
其實(shí)按照我的理解”async”標(biāo)記的方法,告訴編譯器方法內(nèi)有Await ,而當(dāng)程序運(yùn)行到Await 代碼塊的時(shí)候,將會(huì)作為異步處理,當(dāng)異步處理完成后,繼續(xù)處理下面代碼。期間不會(huì)造成期阻塞線程以及UI無(wú)響應(yīng)的情況。
1.普通示例
using System;using System.Threading;using System.Threading.Tasks;namespace Consoleapplication19{ class PRogram { static void Main(string[] args) { AsyncText(); Console.ReadLine(); } static async void AsyncText() { Console.WriteLine("--------------AsyncText Start------------"); await Task.Run(() => { Thread.Sleep(5000); Console.WriteLine("--------------AsyncText.....------------"); }); Console.WriteLine("--------------AsyncText End------------"); } }}
代碼效果
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注