[英]C# multiple async tasks and where to properly await them when they use each other to complete?
我有两种相似的方法,但是,在对此进行理论分析之后,我很确定它们在执行上是不同的。
方法一:
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
,这也是一个异步任务。
然而,第二种方法设置了 Task RenderDocumentBuilder
,但直到它位于ResponseClient
内部时才调用等待的方法,此时它正在等待返回数据。
执行此方法的两种方式都有效,但我不清楚它是否适合:
等待 ResponseClient 之外的任务? (方法一)
或者,在 ResponseClient 外部创建 renderDocumentDirective 任务并在方法内部等待它是否合适? (方法二)
我认为您误解了数据流。
这是你写得更冗长的两种方法
方法一
var renderTask = RenderDocumentBuilder.Instance.GetRenderDocumentDirectiveAsync(previousPage, session);
var renderDocumentDirective = await renderTask;
var alexaResponse = new Response();
alexaResponse.shouldEndSession = null,
alexaResponse.directives = new List<IDirective>();
alexaResponse.directives.Add(renderDocumentDirective);
var buildTask = ResponseClient.Instance.BuildAlexaResponse(alexaResponse, session.alexaSessionDisplayType);
return await buildTask;
方法二
var renderTask = RenderDocumentBuilder.Instance.GetRenderDocumentDirectiveAsync(previousPage, session);
var alexaResponse = new Response()
alexaResponse.shouldEndSession = null,
alexaResponse.directives = new List<IDirective>();
alexaResponse.directives.Add(await renderTask);
var buildTask = ResponseClient.Instance.BuildAlexaResponse(alexaResponse, session.alexaSessionDisplayType);
return await buildTask;
所以你看到唯一真正的区别是方法 2 创建Response
对象,设置shouldEndSession
并在之前创建List
对象,或者它等待renderTask
。
方法 2 可能是有益的,但这取决于GetRenderDocumentDirectiveAsync
的实现方式(即真正的异步)。 但即使是这样,方法 2 也不太可能带来任何性能提升,因为这两种方法之间没有太大区别。
也就是说,我会使用方法 1,因为它看起来更像是同步代码,并且在大多数情况下,您希望在任务可用时尽快等待它,因为 await/async 主要是关于释放线程来做其他事情而不是关于并行性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.