异步 OWIN 管道

Asynchronous OWIN pipeline

我正在使用 ASP.NET 5(核心)和 OWIN 管道。我可以看到很多关于如何输出响应的示例,即:

http://odetocode.com/blogs/scott/archive/2013/11/11/writing-owin-middleware.aspx

但是,如果您采取以下措施:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Run(context =>
        {
            MvcHandler mvcHandler = new MvcHandler();
            return mvcHandler.ProcessRequest(context);
        });
    }
}

public class MvcHandler
{
    public Task ProcessRequest(HttpContext context)
    {
        return Task.Run(() => ProcessRequestInternal(context));
    }

    private void ProcessRequestInternal(HttpContext context)
    {
        context.Response.WriteAsync("Hello world!");
    }
}

如果执行上面的代码,因为ProcessRequestInternal不是异步的,请求还是异步响应还是一个接一个响应?

WriteAsync 是异步的,在非异步上下文中调用。这将使 returned 任务孤立。

您可以return任务,也可以等待任务。

private Task ProcessRequestInternal(HttpContext context)
{
    return context.Response.WriteAsync("Hello world!");
}

private void ProcessRequestInternal(HttpContext context)
{
    context.Response.WriteAsync("Hello world!").Wait();
}

传播异步上下文更好:

private async Task ProcessRequestInternal(HttpContext context)
{
    await context.Response.WriteAsync("Hello world!");
}