给定方法签名:
(awaitable) Task<Token> ITokenService.GetAPIToken();
Run Code Online (Sandbox Code Playgroud)
在这种方法中发生了await什么?
public async Task<User> GetUser(string userId)
{
Token token = await TokenService.GetAPIToken();
//..........
}
Run Code Online (Sandbox Code Playgroud)
我的理解:GetAPIToken调用并且当前的method(GetUser)返回一个Task<User>对象(稍后会提供一个User对象).只有GetAPIToken方法返回后,当前方法的执行才会继续.
如果我错了,token代码等待GetAPIToken()返回方法时的类型/值是什么?
我知道调用此方法的结果会有所不同,因为它可以使用或不使用await关键字调用.对于帖子,请假设它正在被调用await.
我的理解:
GetAPIToken调用并且当前的method(GetUser)返回一个Task<User>对象(稍后会提供一个User对象).只有GetAPIToken方法返回后,当前方法的执行才会继续.
那非常接近.让我们以两种方式清晰起来.
首先,让我们区分返回 - 这意味着,将控制返回给调用者 - 并完成,这意味着该方法表示的任务已完成,并且我们有其值,或者,如果异常完成,则例外.
在非异步方法中,我们不需要进行区分,因为只有在完成时才将控制权返回给调用者.在异步方法中,我们可以返回调用者作为暂停(因为等待未完成的任务)或返回完成(当表示的任务被指示为完成时).
其次,根据任务在创建时的完成情况来表达工作流程是有帮助的; 比如说,这可能发生在缓存的情况下.
因此,让我们现在重新陈述您的理解:
GetAPIToken 被调用并将任务返回给当前用户.Task<User> GetUser将剩余部分指定GetUser为继续Task<Token>,并通过返回来暂停Task<User>Task<Token>完成它运行的延续,它恢复GetUser它离开的地方.代码等待GetAPIToken()方法返回时令牌的类型/值是多少?
那么,token在等同的非异步情况下,它的价值是多少?考虑:
Token x = Foo();
Run Code Online (Sandbox Code Playgroud)
当我们等待Foo完成时,x的价值是多少?制作Foo异步并没有什么不同; 在呼叫正常完成之前,不会为本地分配值.如果Foo进入无限循环,或者如果Foo抛出,则x永远不会分配.
当然,在实践中,C#在创建时为所有本地人分配其默认值,因此这是变量中的值.
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |