[英]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.