新市区做网站,2023年最建议买的手机,海报素材网站推荐,买个网站空间前言在.NET中#xff0c;拥有非托管资源的类通常会实现IDisposable接口#xff0c;以提供一种同步释放非托管资源的机制。但是#xff0c;在某些情况下#xff0c;需要提供一种异步机制来释放非托管资源#xff0c;这时候可以实现IAsyncDisposable接口。在实现此接口后拥有非托管资源的类通常会实现IDisposable接口以提供一种同步释放非托管资源的机制。但是在某些情况下需要提供一种异步机制来释放非托管资源这时候可以实现IAsyncDisposable接口。在实现此接口后将使用DisposeAsync方法来释放这些非托管资源。但是在.NET 6之前即使Controller实现了IAsyncDisposable接口也不会执行DisposeAsync方法。下面让我们来验证一下。Demo1. .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确实被释放了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方法结论最好同时实现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});
}如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“