前言

在.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相关推荐

  1. .NET 6新特性试用 | 总结:我最喜欢的5个特性

    前言 不知不觉,<.NET 6新特性试用>系列文章已经写了20多篇,而今天终于要告一段落了. 如果你还没有看过,详细文章列表在这里: .NET 6新特性试用系列 在这么多特性中,我最喜欢如 ...

  2. 谷歌手机升级android10,Android Q安卓10.0新特性,首批支持升级21款手机

    原标题:Android Q安卓10.0新特性,首批支持升级21款手机 2019年5月8日,一年一度的谷歌I/O开发者大会在美国加州如期召开,并发布了全新系列Android Q(安卓10.0)操作系统, ...

  3. 5.0 新特性试用体验之 Clustered Index

    作者:hzc989 原文来源: https://tidb.net/blog/69dd056c [是否原创]是 [首发渠道]TiDB 社区 [目录] 一.引言 二.基础前情回顾 三.era withou ...

  4. .NET 6新特性试用 | 可空引用类型

    前言 在查看<隐式using指令>功能时,我们在csproj中发现这样一个属性: 那么,Nullable到底是干嘛的? 可为空上下文 严格来说,这不是新特性,而是C# 8.0引入的特性之一 ...

  5. Html5新特性与不支持的旧属性

    HTML 标准自1999年12月发布的 HTML 4.01 后,后继的 HTML 5 和其它标准被束之高阁,为了推动web标准化运动的发展,一些公司联合起来,成立了一个叫做 Web Hypertext ...

  6. .NET 6新特性试用 | SDK工作负载

    前言 为了应对.NET SDK能够支持的程序集项目(例如iOS.Android.WASM)的不断增长,从.NET 6开始,允许用户仅安装必要的SDK(例如ASP.NET Core),而不是一次性安装& ...

  7. .NET 6新特性试用 | LINQ功能改进

    前言 .NET6为LINQ添加了多个新API,在本文中,我们将始终使用User类逐一演示这些添加到LINQ中的内容: public class User {public string Name { g ...

  8. .NET 6新特性试用 | 热重载

    前言 在以前的开发模式下,我们修改代码后必须重新编译.重新运行才能看到效果. 而热重载提供了这样一种特性,它允许你在项目正在运行时修改代码,并将代码更改立即应用于正在运行的应用程序上. 热重载的目的是 ...

  9. Seata 新特性,APM 支持 SkyWalking

    作者:赵禹光,Seata Contributor,SkyWalking PMC ​ 背景前序 ​ 正如所看到的文章题目,就在此时,Seata 与 SkyWalking 两个生态融合,取得了阶段性成果. ...

最新文章

  1. 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest
  2. 操作系统中进程并发运行的过程_三种电磁流量计运行过程中常见故障解决详情!...
  3. 硅谷产品实战-总结:15、如何组织有效的会议?
  4. NSSet所有API学习。
  5. 机器学习(7)--VC维数
  6. ArcGis 10+Oracle发布WFS-T服务,无法更新Feature的解决方法
  7. svn的搭建和和文件检出与提交
  8. Linux中Shell数组的笔记
  9. python游走代码_介绍一个全局最优化的方法:随机游走算法(Random Walk)
  10. linux命令本质,Linux 的命令机制
  11. 分布式压测系列之Jmeter4.0
  12. HDU-2063-过山车(最大匹配)
  13. 离散Hopfield神经网络的联想记忆——数字识别
  14. # 书籍《银河帝国10—裸阳》读后感—20210606
  15. 【黑马程序员】vue学习笔记(未完)
  16. log4j xml配置保存日志天数
  17. 入坑esp-01s 1.3寸OLED带农历时钟及天气显示(四)
  18. 共享网络打印机无法连接计算机,共享打印机连不上的解决方法-电脑自学网
  19. 最多能喝多少啤酒(3)
  20. html怎么给蚊子添加颜色,蚊子喜欢什么颜色,紫色灯光可以招引蚊子

热门文章

  1. sql多表查询之一:Where 和 On的秘密
  2. Razor视图引擎浅析
  3. 轻松实现突破网管限制(SoftEther实际应用)
  4. html调用接口_搜狗ocr识别接口
  5. python input 文件名_Python播放音频与录音
  6. 问题 1: 区间交集
  7. emwin之错误使用控件函数导致死机现象
  8. 知识点:Mysql 索引原理完全手册(1)
  9. (3)Python3笔记之变量与运算符
  10. Integer源码解析