0

我有两种相似的方法,但是,在对此进行理论分析之后,我很确定它们在执行上是不同的。

方法一:

        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);

第一种方法在异步任务 中使用 await 运算符RenderDocumentBuilder,然后在 中使用它ResponseClient,这也是异步任务。

然而,第二种方法设置了 Task RenderDocumentBuilder,但直到它在内部时才调用等待的方法ResponseClient,在执行的这一点上,它正在等待返回数据。

执行此方法的两种方式都有效,但我不清楚它是否适合:

  • 等待 ResponseClient 之外的任务?(方法一)

  • 或者,在 ResponseClient 之外创建 renderDocumentDirective 任​​务并在方法内等待它是否合适?(方法二)

4

1 回答 1

2

我认为您误解了数据流。

这是您的两种方法,写得更冗长

方法一

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 主要是关于释放线程来做其他事情,而不是关于平行性。

于 2020-09-28T14:53:10.333 回答