异步和快速路径优化

本文关键字:路径 优化 异步 | 更新日期: 2023-09-27 18:15:31

我正在对一个OWIN项目进行重构,我遇到了一些关于c#快速路径优化。

所以我读了关于预计算任务的最佳实践,使方法异步或不异步之类的东西。

更准确地说,在快速路径优化上:

基于任务的异步模式最佳实践(快速路径p9) http://www.microsoft.com/en-us/download/details.aspx?id=19957

与迭代器的指导相同,这对我来说更容易理解,因为我对TAP很陌生http://social.msdn.microsoft.com/forums/en - us/d9146792 - 1 - b9a - 4807 a42e - 29107 - c281cc4/can -等待- taskfromresult介绍concurrency?forum=async

下面是我遇到的代码:

public class CustomMiddleware2 : OwinMiddleware
{
    public override async Task Invoke(IOwinContext context)
    {
        await InvokeInternal(context);
    }
    private Task InvokeInternal(IOwinContext context)
    {           
        if (Wacko.WhatDOuKnow)
        {
            context.Response.Redirect("/awesomeurl");
            //fast path
            return Task.FromResult<object>(null);
        }
        return Next.Invoke(context);
    }
    public CustomMiddleware2(OwinMiddleware next)
        : base(next)
    {
    }
}

,这是我实际打算做的替换:

public class BetterOrNotMiddleware : OwinMiddleware
{
    public override Task Invoke(IOwinContext context)
    {
        if (Wacko.WhatDOuKnow)
        {
            context.Response.Redirect("/awesomeurl");
            //fast path
            return Task.FromResult<object>(null);
        }
        else
            return InvokeInternal(context);
    }
    private async Task InvokeInternal(IOwinContext context)
    {
        await Next.Invoke(context);
    }
    public BetterOrNotMiddleware(OwinMiddleware next)
        : base(next)
    {
    }
}
问题是,没有太大的差别。我不确定BetterOrNotMiddleware类是更优化还是更合适?我觉得等下一班比较合适。调用调用,代码可能会更容易理解,因为这与使用迭代器处理异常的模式相同(上面的链接)

我可能错过了一些关于异步状态机或调用堆栈的东西,这些东西可以验证第二种方法,但是我对异步太陌生了,无法获得它。

但如果这一切只是一个微优化,我不确定我想要费心改变应用程序中的所有中间件。好吧,尽管如此

异步和快速路径优化

这些几乎完全相同。这两个选项之间没有真正的区别,除了不需要进行第二次方法调用(无论如何编译器可以对其进行优化)。

你可以只用一个方法来做所有的事情:

public class BetterOrNotMiddleware : OwinMiddleware
{
    private static readonly Task CompletedTask = Task.FromResult<object>(null);
    public override Task Invoke(IOwinContext context)
    {
        if (Wacko.WhatDOuKnow)
        {
            context.Response.Redirect("/awesomeurl");
            // fast path
            return CompletedTask;
        }
        else
        {
            return Next.Invoke(context);
        }
    }
    // ...
}

编辑:实际上没有理由每次都创建一个新任务,所以我使用一个静态完成的任务来代替。

在第一个代码示例中,为什么要等待呢?

public override Task Invoke(IOwinContext context)
{
    return InvokeInternal(context);
}

第二个代码示例也是如此,您可以使两个示例完全快速路径,因此它们几乎完全相同。

InvokeInternal方法对我来说似乎毫无意义,只需将逻辑直接放在Invoke中,即

public override Task Invoke(IOwinContext context)
{
    if (Wacko.WhatDOuKnow)
    {
        context.Response.Redirect("/awesomeurl");
        return Task.FromResult<object>(null);
    }
    return Next.Invoke(context);
}