簡體   English   中英

C# 多個異步任務以及當它們相互使用完成時在哪里正確等待它們?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM