【发布时间】:2020-09-28 14:35:20
【问题描述】:
我有两种相似的方法,但是,在对此进行理论分析之后,我很确定它们在执行上是不同的。
方法一:
var renderDocumentDirective = await
RenderDocumentBuilder.Instance.GetRenderDocumentDirectiveAsync(previousPage, session);
return await ResponseClient.Instance.BuildAlexaResponse(new Response()
{
shouldEndSession = null,
directives = new List<IDirective>()
{
renderDocumentDirective
}
}, session.alexaSessionDisplayType);
方法二
var renderDocumentDirective = RenderDocumentBuilder.Instance.GetRenderDocumentDirectiveAsync(previousPage, session);
return await ResponseClient.Instance.BuildAlexaResponse(new Response()
{
shouldEndSession = null,
directives = new List<IDirective>()
{
await renderDocumentDirective
}
}, session.alexaSessionDisplayType);
第一种方法在异步任务RenderDocumentBuilder 上使用await 运算符,然后在ResponseClient 中使用它,这也是一个异步任务。
然而,第二种方法设置了任务RenderDocumentBuilder,但直到它位于 ResponseClient 内部时才调用等待的方法,此时它正在等待返回数据。
执行此方法的两种方式都有效,但我不清楚它是否适合:
-
等待 ResponseClient 之外的任务? (方法一)
-
或者,在 ResponseClient 之外创建 renderDocumentDirective 任务并在方法内等待它是否合适? (方法二)
【问题讨论】:
-
我认为第一个更清晰易读,但除非
new Response()调用有一些奇怪的副作用,否则它们几乎相同。 -
看看他们编译成什么 IL 会很有趣;我怀疑同样的事情。我会呼应 Guru Stron,因为第一个更具可读性并且意图更清晰。另外,我认为您可以更好地处理第一个示例中
GetRenderDocumentDirectiveAsync引起的任何异常。 -
@GuruStron 为什么
ResponseClient.Instance的实现很重要?在等待之前评估整个表达式。 -
@JohnathanBarclay 是的,同意。
-
你的意思是在等待之前评估它,因为它是一个单例实例吗?
标签: c# async-await