【问题标题】:Does Async in Parentheses Block? (Non-literal Expression)括号中的异步是否阻塞? (非文字表达)
【发布时间】:2021-08-26 16:23:18
【问题描述】:

下面一行...

var isAuthorized = (await _authorizationService.AuthorizeAsync(...)).Succeeded;

...导致异步执行与调用者不同,直到找到AuthorizeAsync(...) 的结果,还是会阻塞线程直到找到结果?为什么或为什么不?

根据this question for vb.net,这样的表达式被称为非文字。根据Fluently Calling Await without ParenthesesHow to Design Fluent Async Operations 的问题和回答,这个说法似乎很好。但是,我想确定一下,并从使这种特殊情况清楚的文档中知道为什么。

【问题讨论】:

  • async 通常意味着它不会阻塞线程。
  • @DanielA.White 100% 同意。只是想确保这不是一个奇怪的边缘情况。

标签: c# async-await


【解决方案1】:

这里:

var object = _authorizationService.AuthorizeAsync(...)

object = 任务本身。


这里:

var object = await _authorizationService.AuthorizeAsync(...)

object = 任务的评估,也就是结果。


这里

var object = (await _authorizationService.AuthorizeAsync(...)).Succeeded;

你在玩评估。 (它不会阻止任何东西,它不像使用_authorizationService.AuthorizeAsync(...).Result)。


这个:

var object = (await _authorizationService.AuthorizeAsync(...)).Succeeded

是这个,但在一行中

var aux = await _authorizationService.AuthorizeAsync(...);
var object = aux.Succeeded;

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多