繁体   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