.NET 6新特性试用 | Controller支持IAsyncDisposable

前言

在.NET中,拥有非托管资源的类通常会实现IDisposable接口,以提供一种同步释放非托管资源的机制。

但是,在某些情况下,需要提供一种异步机制来释放非托管资源,这时候可以实现IAsyncDisposable接口。

在实现此接口后,将使用DisposeAsync方法来释放这些非托管资源。

但是,在.NET 6之前,即使Controller实现了IAsyncDisposable接口,也不会执行DisposeAsync方法。

下面,让我们来验证一下。

Demo

1. .NET 5.0

使用VS 2019创建基于.NET 5.0框架的Web API项目,然后修改WeatherForecastController代码,实现IAsyncDisposable接口:

public class WeatherForecastController : ControllerBase, IAsyncDisposable
{
    [ApiExplorerSettings(IgnoreApi = true)]
    public ValueTask DisposeAsync()
    {
        throw new NotImplementedException();
    }
}

加上ApiExplorerSettings是为了避免swagger报错

执行请求,发现并没有抛出异常,说明没有执行DisposeAsync方法。

而当我们实现IDisposable接口后,再次执行请求,会执行Dispose方法抛出异常,说明Controller确实被释放了:

093b1041ebcafc0121c96cb91582a70c.png

2. .NET 6.0

使用VS 2022创建基于.NET 6.0框架的Web API项目,然后修改WeatherForecastController代码,实现IAsyncDisposable接口:

public class WeatherForecastController : ControllerBase, IAsyncDisposable
{
    [ApiExplorerSettings(IgnoreApi = true)]
    public async ValueTask DisposeAsync()
    {
        _logger.LogInformation($"{DateTime.Now} Begin DisposeAsync");
        await Task.Delay(3000);//模拟异步释放非托管资源
        _logger.LogInformation($"{DateTime.Now} End DisposeAsync");
    }
}

运行效果如下,执行了DisposeAsync方法:

e70dc35d1b382f6de82533bed748c54b.png

结论

最好同时实现IDisposable和IAsyncDisposable接口,确保释放资源:

[ApiExplorerSettings(IgnoreApi = true)]
public void Dispose()
{
    _logger.LogInformation($"{DateTime.Now} Begin Dispose");
    Dispose(disposing: true);
    _logger.LogInformation($"{DateTime.Now} End Dispose");
}

[ApiExplorerSettings(IgnoreApi = true)]
public async ValueTask DisposeAsync()
{
    _logger.LogInformation($"{DateTime.Now} Begin DisposeAsync");
    await Task.Delay(3000);//模拟异步释放非托管资源

    Dispose(disposing: false);
    _logger.LogInformation($"{DateTime.Now} End DisposeAsync");
}

protected void Dispose(bool disposing)
{
    if (disposing)
    {
        Thread.Sleep(3000);//模拟同步释放非托管资源
    }
    _logger.LogInformation($"{DateTime.Now} Dispose {disposing}");
}

fd1bb43b9759fccb27cbbae0bec2a4cc.png

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值