ASP.NET 异步
最后修改于 2025 年 4 月 3 日
在本文中,我们探讨 ASP.NET 8 中的异步编程。异步操作通过在 I/O 操作期间释放线程来提高可伸缩性。
ASP.NET Core 从底层设计上就是为异步而生的。异步编程有助于构建响应式应用程序,这些应用程序可以处理更多并发请求。
基本定义
ASP.NET 中的异步编程允许代码非阻塞执行。async/await 模式在保持结构的同时简化了异步代码的编写。
异步方法返回 Task 或 Task<T>,并包含 await 表达式。await 关键字会暂停执行,直到等待的任务完成。
异步对于 I/O 密集型操作(如数据库调用、文件操作和 Web 服务请求)尤其有价值。它可以防止线程池耗尽。
ASP.NET 异步示例
以下示例演示了 ASP.NET 8 中的异步控制器操作。
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
var app = builder.Build();
app.MapControllers();
app.Run();
这会设置一个支持控制器和 Entity Framework Core 的 ASP.NET 应用程序。数据库上下文已配置为进行依赖注入。
Controllers/ProductsController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private readonly AppDbContext _context;
public ProductsController(AppDbContext context)
{
_context = context;
}
[HttpGet]
public async Task<IActionResult> GetAllProductsAsync()
{
var products = await _context.Products.ToListAsync();
return Ok(products);
}
[HttpGet("{id}")]
public async Task<IActionResult> GetProductByIdAsync(int id)
{
var product = await _context.Products.FindAsync(id);
if (product == null) return NotFound();
return Ok(product);
}
[HttpGet("expensive")]
public async Task<IActionResult> GetExpensiveProductsAsync()
{
var products = await _context.Products
.Where(p => p.Price > 100)
.OrderByDescending(p => p.Price)
.ToListAsync();
return Ok(products);
}
}
此控制器演示了三个异步操作。每个方法都用 async 标记并返回 Task<IActionResult>。await 关键字用于所有数据库操作。
第一个方法异步检索所有产品。第二个方法按 ID 获取单个产品。第三个方法展示了一个更复杂的、带有过滤和排序的查询。
Entity Framework Core 提供了所有数据访问方法(如 ToListAsync 和 FindAsync)的异步版本。在 Web 应用程序中应始终使用它们以提高可伸缩性。
异步模式允许线程池在等待数据库操作时处理其他请求。这提高了服务器在负载下的吞吐量。
来源
在本文中,我们探讨了 ASP.NET 8 中的异步编程。正确使用 async/await 可以显著提高应用程序的性能和可伸缩性。