在ASP.NET Core中,异步编程模型(Async/Await)是处理I/O密集型操作(如数据库访问、网络请求等)的推荐方式。Task<IActionResult>
表示一个异步操作,该操作最终会返回一个IActionResult
类型的结果。
[HttpGet("{id}")]
public async Task<IActionResult> GetAsync(int id)
{
var item = await _repository.GetItemByIdAsync(id);
if (item == null)
{
return NotFound();
}
return Ok(item);
}
[HttpPost]
public async Task<IActionResult> CreateAsync([FromBody] ItemDto itemDto)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var validationResult = await _validator.ValidateAsync(itemDto);
if (!validationResult.IsValid)
{
return BadRequest(validationResult.Errors);
}
var createdItem = await _repository.AddAsync(itemDto);
return CreatedAtAction(nameof(GetAsync), new { id = createdItem.Id }, createdItem);
}
问题:在异步代码中同步等待(.Result
或.Wait()
)可能导致死锁。
解决方案:
async/await
模式.Result
或.Wait()
async
问题:方法内部使用await
但未标记为async
。
解决方案:
// 错误
public Task<IActionResult> Get(int id)
{
var item = await _repository.GetItemByIdAsync(id); // 编译错误
return Ok(item);
}
// 正确
public async Task<IActionResult> Get(int id)
{
var item = await _repository.GetItemByIdAsync(id);
return Ok(item);
}
问题:异步方法中的异常可能被吞没。
解决方案:
[HttpGet]
public async Task<IActionResult> GetAll()
{
try
{
var items = await _repository.GetAllAsync();
return Ok(items);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error getting all items");
return StatusCode(500, "Internal server error");
}
}
Async
后缀:如GetAsync
而不是Get
ConfigureAwait(false)
:在库代码中使用以避免不必要的上下文切换[HttpGet]
public async Task<IActionResult> Search(string query, CancellationToken cancellationToken)
{
var results = await _searchService.SearchAsync(query, cancellationToken);
return Ok(results);
}
Task.WhenAll
并行执行多个独立操作[HttpGet("batch")]
public async Task<IActionResult> GetBatch(int[] ids)
{
var tasks = ids.Select(id => _repository.GetItemByIdAsync(id));
var items = await Task.WhenAll(tasks);
return Ok(items.Where(i => i != null));
}
通过正确使用异步Task<IActionResult>
,可以显著提高ASP.NET Core Web API的性能和可扩展性。
没有搜到相关的文章