异步 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!");
}
我正在使用 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!");
}