今天就跟大家聊聊有關(guān)await foreach怎么在C# 8.0中使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),玉林網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:玉林等地區(qū)。玉林做網(wǎng)站價(jià)格咨詢:18980820575static int SumFromOneToCount(int count) { ConsoleExt.WriteLine("SumFromOneToCount called!"); var sum = 0; for (var i = 0; i <= count; i++) { sum = sum + i; } return sum; }
調(diào)用方法.
static void Main(string[] args) { const int count = 5; ConsoleExt.WriteLine($"Starting the application with count: {count}!"); ConsoleExt.WriteLine("Classic sum starting."); ConsoleExt.WriteLine($"Classic sum result: {SumFromOneToCount(count)}"); ConsoleExt.WriteLine("Classic sum completed."); ConsoleExt.WriteLine("################################################"); }
輸出結(jié)果.
可以看到,整個(gè)過程就一個(gè)線程Id為1的線程自上而下執(zhí)行,這是最基礎(chǔ)的做法.
Yield Return
接下來,我們使用yield運(yùn)算符使得這個(gè)方法編程延遲加載,如下所示.
static IEnumerableSumFromOneToCountYield(int count) { ConsoleExt.WriteLine("SumFromOneToCountYield called!"); var sum = 0; for (var i = 0; i <= count; i++) { sum = sum + i; yield return sum; } }
主函數(shù)
static void Main(string[] args) { const int count = 5; ConsoleExt.WriteLine("Sum with yield starting."); foreach (var i in SumFromOneToCountYield(count)) { ConsoleExt.WriteLine($"Yield sum: {i}"); } ConsoleExt.WriteLine("Sum with yield completed."); ConsoleExt.WriteLine("################################################"); ConsoleExt.WriteLine(Environment.NewLine); }
運(yùn)行結(jié)果如下.
正如你在輸出窗口中看到的那樣,結(jié)果被分成幾個(gè)部分返回,而不是作為一個(gè)值返回。以上顯示的累積結(jié)果被稱為惰性枚舉。但是,仍然存在一個(gè)問題,即 sum 方法阻塞了代碼的執(zhí)行。如果你查看線程ID,可以看到所有東西都在主線程1中運(yùn)行,這顯然不完美,繼續(xù)改造.
Async Return
我們?cè)囍鴮sync用于SumFromOneToCount方法(沒有yield關(guān)鍵字).
static async TaskSumFromOneToCountAsync(int count) { ConsoleExt.WriteLine("SumFromOneToCountAsync called!"); var result = await Task.Run(() => { var sum = 0; for (var i = 0; i <= count; i++) { sum = sum + i; } return sum; }); return result; }
主函數(shù).
static async Task Main(string[] args) { const int count = 5; ConsoleExt.WriteLine("async example starting."); // Sum runs asynchronously! Not enough. We need sum to be async with lazy behavior. var result = await SumFromOneToCountAsync(count); ConsoleExt.WriteLine("async Result: " + result); ConsoleExt.WriteLine("async completed."); ConsoleExt.WriteLine("################################################"); ConsoleExt.WriteLine(Environment.NewLine); }
運(yùn)行結(jié)果.
我們可以看到計(jì)算過程是在另一個(gè)線程中運(yùn)行,但結(jié)果仍然是作為一個(gè)值返回!任然不完美.
如果我們想把惰性枚舉(yield return)與異步方法結(jié)合起來,即返回Task Task 我們根據(jù)假設(shè)把代碼改造一遍,使用Task 可以看到,直接出現(xiàn)錯(cuò)誤. IAsyncEnumerable 其實(shí),在C# 8.0中Task AsyncStream 下面,我們就來見識(shí)一下AsyncStrema的威力,我們使用IAsyncEnumerable來對(duì)函數(shù)進(jìn)行改造,如下. 主函數(shù). 如果一切順利,那么就能看到這樣的運(yùn)行結(jié)果了. 最后,看到這就是我們想要的結(jié)果,在枚舉的基礎(chǔ)上,進(jìn)行了異步迭代. 可以看到,整個(gè)計(jì)算過程并沒有造成主線程的阻塞,其中,值得重點(diǎn)關(guān)注的是紅色方框區(qū)域的線程5!線程5!線程5!線程5在請(qǐng)求下一個(gè)結(jié)果后,并沒有等待結(jié)果返回,而是去了Main()函數(shù)中做了別的事情,等待請(qǐng)求的結(jié)果返回后,線程5又接著執(zhí)行foreach中任務(wù). Client/Server的異步拉取 如果還沒有理解Async Streams的好處,那么我借助客戶端 / 服務(wù)器端架構(gòu)是演示這一功能優(yōu)勢的絕佳方法。 同步調(diào)用 客戶端向服務(wù)器端發(fā)送請(qǐng)求,客戶端必須等待(客戶端被阻塞),直到服務(wù)器端做出響應(yīng). 示例中Yield Return就是以這種方式執(zhí)行的,所以整個(gè)過程只有一個(gè)線程即線程1在處理. 異步調(diào)用 客戶端發(fā)出數(shù)據(jù)塊請(qǐng)求,然后繼續(xù)執(zhí)行其他操作。一旦數(shù)據(jù)塊到達(dá),客戶端就處理接收到的數(shù)據(jù)塊并詢問下一個(gè)數(shù)據(jù)塊,依此類推,直到達(dá)到最后一個(gè)數(shù)據(jù)塊為止。這正是 Async Streams 想法的來源。 最后一個(gè)示例就是以這種方式執(zhí)行的,線程5詢問下一個(gè)數(shù)據(jù)后并沒有等待結(jié)果返回,而是去做了Main()函數(shù)中的別的事情,數(shù)據(jù)到達(dá)后,線程5又繼續(xù)處理foreach中的任務(wù). Tips 如果你使用的是.net core 2.2及以下版本,會(huì)遇到這樣的報(bào)錯(cuò). 需要安裝.net core 3.0 preview的SDK(截至至博客撰寫日期4月9日,.net core SDK最新版本為3.0.100-preview3-010431),安裝好SDK后,如果你是VS 2019正式版,可能無法選擇3.0的與預(yù)覽版,聽過只有VS 2019 Preview才支持.Net core 3.0的預(yù)覽版. 看完上述內(nèi)容,你們對(duì)await foreach怎么在C# 8.0中使用有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,感謝大家的支持。 另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。public interface IAsyncEnumerable
static async Task ConsumeAsyncSumSeqeunc(IAsyncEnumerable
static async Task Main(string[] args)
{
const int count = 5;
ConsoleExt.WriteLine("Starting Async Streams Demo!");
// Start a new task. Used to produce async sequence of data!
IAsyncEnumerable
分享文章:awaitforeach怎么在C#8.0中使用-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://weahome.cn/article/jppjg.html