ZetCode

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 提供了所有数据访问方法(如 ToListAsyncFindAsync)的异步版本。在 Web 应用程序中应始终使用它们以提高可伸缩性。

异步模式允许线程池在等待数据库操作时处理其他请求。这提高了服务器在负载下的吞吐量。

来源

Microsoft ASP.NET 异步编程文档

在本文中,我们探讨了 ASP.NET 8 中的异步编程。正确使用 async/await 可以显著提高应用程序的性能和可伸缩性。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 ASP.NET 教程