非同步CTP(Async CTP)為什麼那樣工作?

2021-08-08 15:19:20 字數 2263 閱讀 6096

對非同步ctp感興趣有很多原因。非同步ctp使非同步程式設計比以前更加容易了。它雖然沒有rx強大,但是更容易學。非同步ctp介紹了兩個新的關鍵字,async和await。非同步方法(或lambda表示式)必須返回void,task或task。這篇文章不是介紹非同步ctp的,因為網上有很多這樣的文章。這篇文章的目的是把程式設計師開始使用async ctp遇到的一些常見問題集中起來。

當從非同步方法返回乙個值的時候,此方法體直接返回這個值,但該方法本身被宣告為返回乙個task。當宣告乙個返回甲型別的方法卻必須返回乙個乙型別時,就有點「斷連」了。

//

實際語法

public

async taskgetvalue()

問題來了:為什麼我不能這麼寫?

//

假想語法

public

async

intgetvalue()

思考:該方法如何如何照顧呼叫者呢?非同步方法必須返回乙個實際結果型別task的值。因此,getvalue方法會出現返回task的智慧型提示(在物件瀏覽器,reflector等中也是這樣的)。

在設計之初,推斷返回型別已經被考慮到了,但該設計團隊已經推斷出在非同步方法中保持這種「斷連」比在**基上擴大這種「斷連」更好。如今這種「斷連」仍存在,但比以前更小了。該設計團隊的共識是一致的方法簽名更佳。

思考:async void 和async task有什麼區別?

乙個async task方法就像任何其他的非同步操作一樣,只是沒有返回值。乙個async void方法扮演一種高階操作。async task方法可能被組合進其他使用using await的非同步方法。async void方法可能被用作乙個事件控制代碼。async void方法也有其他重要的屬性:在asp.net上下文中,它通知web伺服器直到它返回,頁面才完成。

推斷返回型別會移除async void 和async task間的區別:要麼所有的非同步方法是async void(阻止可組合性),要麼都是async task(阻止它們來自事件控制代碼,同時對asp.net要有乙個可選擇的方案)。

在方法宣告返回型別和方法體返回的型別之間仍有「斷連」。該設計團隊的另乙個建議是:給return新增乙個關鍵字來指示return返回的值,但這個也確實沒有返回什麼,如下所示:

//

假想語法

public

async taskgetvalue()

思考:將大量的**從同步轉為非同步。

async return關鍵字也被考慮到了,但並沒有足夠的說服力。當把一些同步**轉成非同步**時,這尤其正確。強制人們給每個return語句新增asynchronous就好像是「不必要的忙碌」。比較而言,習慣於「斷連」更容易。

async關鍵字必須用在使用了await關鍵字的方法上。然而,如果把async用在了乙個沒有使用await的方法上,也會收到乙個警告。

問題:為什麼async不能根據await的存在推斷出來?

//

假想語法

public taskgetvalue()

思考:向後相容性和**可讀性

單字的await關鍵字具有太大的打破變化。在非同步方法上的多字await(如await for)或乙個關鍵字之間的選擇,只是在那個方法內部啟用await關鍵字。很明顯,使用async標記方法讓人類和計算機分析起來更容易,因此設計團隊決定使用async/await對。

問題:既然顯示包括async有意義(看上面),為什麼await不能根據async的存在推斷出來呢?

//

假想語法

public

async taskgetvalue()

思考:非同步操作的並行組合。

乍一看,推斷await推斷似乎簡化了基本的非同步操作。只要所有的等待可以按序列(如乙個操作等待,然後另乙個,再然後另乙個)完成,這個就能很好的工作。然而,當有人考慮並行組合的時候,它崩潰了。

非同步ctp中的並行組合使用taskex.whenany 和taskex.whenall方法。這有乙個簡單的例子,這個方法立即開始了兩個操作,並且等待它們完成。

//

實際語法

public

async taskgetvalue()

為了處理並行組合,我們必須有能力說我們將不會await乙個表示式。

非同步CTP(Async CTP)為什麼那樣工作?

對非同步ctp感興趣有很多原因。非同步ctp使非同步程式設計比以前更加容易了。它雖然沒有rx強大,但是更容易學。非同步ctp介紹了兩個新的關鍵字,async和await。非同步方法 或lambda表示式 必須返回void,task或task。這篇文章不是介紹非同步ctp的,因為網上有很多這樣的文章。...

batch normalization為什麼效果好

batch normalization為什麼效果好 深度學習中 batch normalization為什麼效果好?龍鵬 言有三的回答 知乎 深度學習中 batch normalization為什麼效果好?魏秀參的回答 知乎 為什麼batch normalization那麼有用?autocyz的文章...

為什是 property不自動生成屬性?

使用 property 時候,xcode 會自動為我們生 setter 和 getter,甚至會自動生成屬性。例如下面的情況 h 檔案 inte ce person nsobject property copy,nonatomic nsstring name end m 檔案 implementat...