一,最近在學習abp的東西。發現其中作者在獲取數據時,大量的使用了async和awaiit。好吧,因為不太懂,所以網上搜搜,在這裡記錄一下。 先來看一段代碼。調用UpdateUserAsync會返回一個Task,那task是個啥呢。根據騰飛(Jesse)的說法,task是async和awaiit的叔 ...
一,最近在學習abp的東西。發現其中作者在獲取數據時,大量的使用了async和awaiit。好吧,因為不太懂,所以網上搜搜,在這裡記錄一下。
先來看一段代碼。調用UpdateUserAsync會返回一個Task,那task是個啥呢。根據騰飛(Jesse)的說法,task是async和awaiit的叔叔。
protected virtual async Task UpdateUserAsync(CreateOrUpdateUserInput input) { var user = await UserManager.FindByIdAsync(input.User.Id.Value); if (!input.User.Password.IsNullOrEmpty()) { CheckErrors(await UserManager.ChangePasswordAsync(user, input.User.Password)); } CheckErrors(await UserManager.UpdateAsync(user)); //Update roles CheckErrors(await UserManager.SetRoles(user, input.AssignedRoleNames)); if (input.SendActivationEmail) { user.SetNewEmailConfirmationCode(); await _userEmailer.SendEmailActivationLinkAsync(user, input.User.Password); } }
二,運行機制
async標記會告訴編輯器接下來的方法可能會用到非同步,當然並不一定會有用到,一直向下到awaite這是會等待,await 不會開啟新的線程,當前線程會一直往下走直到遇到真正的Async方法(比如說HttpClient.GetStringAsync),這個方法的內部會用Task.Run或者Task.Factory.StartNew 去開啟線程。也就是如果方法不是.NET為我們提供的Async方法,我們需要自己創建Task,才會真正的去創建線程。
大概就是這樣歡迎批評指正
參考
https://www.cnblogs.com/jesse2013/p/async-and-await.html#realawait
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/index