在这做什么等待?

Mat*_*t W 1 c# async-await

给定方法签名:

(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.

Eri*_*ert 7

我的理解:GetAPIToken调用并且当前的method(GetUser)返回一个Task<User>对象(稍后会提供一个User对象).只有GetAPIToken方法返回后,当前方法的执行才会继续.

那非常接近.让我们以两种方式清晰起来.

首先,让我们区分返回 - 这意味着,将控制返回给调用者 - 并完成,这意味着该方法表示的任务已完成,并且我们有其值,或者,如果异常完成,则例外.

在非异步方法中,我们不需要进行区分,因为只有在完成时才将控制权返回给调用者.在异步方法中,我们可以返回调用者作为暂停(因为等待未完成的任务)或返回完成(当表示的任务被指示为完成时).

其次,根据任务在创建时的完成情况来表达工作流程是有帮助的; 比如说,这可能发生在缓存的情况下.

因此,让我们现在重新陈述您的理解:

  • GetAPIToken 被调用并将任务返回给当前用户.
  • 如果任务完成,则GetApiToken在完成所有工作后返回.GetUser从已完成的任务中提取令牌,并在不挂起的情况下继续.
  • 如果任务未完成,并且这是GetUser中的第一个等待,则GetUser会创建一个 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#在创建时为所有本地人分配其默认值,因此这是变量中的值.