其实主要逻辑就是循环释放_disposables
里的所有对象,也就是实现了IDisposable
接口的对象 。接下来咱们再来看一下异步释放的相关逻辑 。
public ValueTask DisposeAsync(){ List<object> toDispose = BeginDispose(); if (toDispose != null) { try { for (int i = toDispose.Count - 1; i >= 0; i--) { object disposable = toDispose[i]; //判断是否是实现了IAsyncDisposable接口的对象 if (disposable is IAsyncDisposable asyncDisposable) { //获取DisposeAsync方法返回值也就是ValueTask ValueTask vt = asyncDisposable.DisposeAsync(); if (!vt.IsCompletedSuccessfully) { return Await(i, vt, toDispose); } //阻塞等待DisposeAsync执行完成 vt.GetAwaiter().GetResult(); } else { ((IDisposable)disposable).Dispose(); } } } catch (Exception ex) { return new ValueTask(Task.FromException(ex)); } } return default; static async ValueTask Await(int i, ValueTask vt, List<object> toDispose) { //等待DisposeAsync方法里的逻辑执行完成 await vt.ConfigureAwait(false); i--; for (; i >= 0; i--) { object disposable = toDispose[i]; if (disposable is IAsyncDisposable asyncDisposable) { //等待DisposeAsync执行完成 await asyncDisposable.DisposeAsync().ConfigureAwait(false); } else { ((IDisposable)disposable).Dispose(); } } }}
推荐阅读
- asp.net core web 解决方案多项目模板制作打包总结
- ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写
- 上 学习ASP.NET Core Blazor编程系列六——新增图书
- Azure DevOps Pipelines部署.Net Core 应用到Kubernetes
- C语言小白刷题
- 记一次 .NET 某企业OA后端服务 卡死分析
- .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现
- .Net CLR异常简析
- 记一次 .NET 某电子病历 CPU 爆高分析
- .NET 7 RC 2 发布,倒计时一个月发布正式版