.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確實被釋放了:
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“
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的.NET 6新特性试用 | Controller支持IAsyncDisposable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABP Framework 5.0 RC
- 下一篇: ASP.NET Core 跨平台图形验证