亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Async await關鍵字是否等同于ContinueWith lambda?

Async await關鍵字是否等同于ContinueWith lambda?

C#
開滿天機 2019-12-26 10:15:16
有人可以請我確認我是否正確理解Async await關鍵字嗎?(使用CTP版本3)到目前為止,我已經得出結論,在方法調用之前插入await關鍵字實際上可以完成兩件事:A。它創建立即返回,B。它創建“繼續”,在異步方法調用完成時調用。無論如何,繼續是該方法的代碼塊的其余部分。因此,我想知道的是,這兩段代碼在技術上是否等效,如果是,這是否基本上意味著await關鍵字與創建ContinueWith Lambda相同(即,它基本上是一個編譯器的快捷方式)?如果沒有,有什么區別?bool Success =    await new POP3Connector(        "mail.server.com", txtUsername.Text, txtPassword.Text).Connect();// At this point the method will return and following code will// only be invoked when the operation is complete(?)MessageBox.Show(Success ? "Logged In" : "Wrong password");VS(new POP3Connector(    "mail.server.com", txtUsername.Text, txtPassword.Text ).Connect()).ContinueWith((success) =>    MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));
查看完整描述

3 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

總體思路是正確的-該方法的其余部分被制成各種形式的延續。


在“快速通道”的博客文章有如何的細節async/ await編譯器改造工程。


差異,浮現在腦海:


該await關鍵字還使用“調度環境”的概念。調度上下文是(SynchronizationContext.Current如果存在的話),返回TaskScheduler.Current。然后,繼續在調度上下文上運行。因此,如果需要的話,可以更近似地傳遞TaskScheduler.FromCurrentSynchronizationContext給ContinueWith,然后再回落TaskScheduler.Current。


實際async/ await實現基于模式匹配;它使用“等待”模式,該模式允許等待任務以外的其他事情。例如WinRT異步API,某些特殊方法(例如YieldRx observables和特殊套接字可等待),它們對GC的影響不那么嚴重。任務功能強大,但并不是唯一可以等待的任務。


還有一點細微的挑剔的區別:如果等待已完成,則該async方法實際上不會在此時返回;它同步地繼續。因此,這有點像傳遞TaskContinuationOptions.ExecuteSynchronously,但是沒有與堆棧相關的問題。


查看完整回答
反對 回復 2019-12-26
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

異步/等待比ContinueWith(...)更具表現力的另一個例子是異常的流動。您可以在同一個try塊中等待多次,對于執行的每個階段,可以將它們的異常集中到同一catch(...)塊中,而不必編寫大量的代碼來明確地執行此操作。

查看完整回答
反對 回復 2019-12-26
  • 3 回答
  • 0 關注
  • 288 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號