ASP.NET 使用 Dispose 释放资源的四种方法详细介绍

目录
  • 1. 创建一个实现 IDisposable 接口的类
  • 2. 使用 “using” 语句处理 IDisposable 对象
  • 3. 在请求结束时处理 IDisposable 对象
  • 4. 使用内置的 IoC 容器处理 IDisposable 对象
  • 5. 使用 IHostApplicationLifetime 事件处理 IDependency 对象

ASP.NET 使用 Dispose 释放资源的四种方法

Dispose 和 Finalize 是运行的 .NET 和 .NET Core 应用程序释放占用的资源的两种方法。通常,如果应用程序中有非托管资源,应该显式地释放这些资源占用的资源。

由于 Finalize 的非确定性,以及在性能方面的成本很高,因此 Dispose 方法的使用频率远高于 Finalize。其实,我们可以在一个实现了 IDisposable 接口的类型上使用 Dispose 方法。

本文中提供的代码示例均默认运行在 Visual Studio 2022。

 使用 VS2022 创建 ASP.NET Core 项目

我们在 Visual Studio 2022 中创建一个 ASP.NET Core 项目。按照以下步骤在 Visual Studio 2022 中创建一个新的 ASP.NET Core Web API 6 项目。

1) 启动 Visual Studio 2022 IDE。2) 单击 “Create new project”。

3) 在 “Create new project” 窗口中,从显示的模板列表中选择 “ASP.NET Core Web API”。

4) 点击下一步。

5) 在 “Configure your new project” 窗口中,指定新项目的名称和位置。

6) 根据您的偏好,可选择选中 “Place solution and project in the same directory” 复选框。

7) 点击下一步。

8) 在接下来显示的 “Additional Information” 窗口中,从顶部的下拉列表中选择 .NET 6.0 作为目标框架。将 “Authentication Type” 保留为 “None”(默认)。确保选中 “Use controllers ...” 选项。

9) 确保未选中 “Enable Docker,”、“Configure for HTTPS” 和 “Enable Open API Support” 复选框,因为我们不会在此处使用任何这些功能。您也可以选择取消选中 “Use controllers(取消选中以使用最少的 API)” 复选框,因为我们将创建自己的控制器。

10) 单击创建。这将在 Visual Studio 2022 中创建一个新的 ASP.NET Core 6 Web API 项目。我们将在本文的后续部分中使用该项目来说明 Dispose 的用法。

1. 创建一个实现 IDisposable 接口的类

我们现在将创建一个实现 IDisposable 接口的类,代码如下:

public class FileManager: IDisposable {
    FileStream fileStream = new FileStream(@"C:\Test.txt",
    FileMode.Append);
    public async Task Write(string text) {
            byte[] buffer = Encoding.Unicode.GetBytes(text);
            int offset = 0;
            try {
                await fileStream.WriteAsync(buffer, offset,
                buffer.Length);
            }
            catch {
                //Write code here to handle exceptions.
            }
    }
    public void Dispose() {
            if (fileStream != null) {
                fileStream.Dispose();
            }
    }
}

FileManager 类实现 IDisposable 接口并包含两个方法:Write 和 Dispose。前者用于将文本异步写入文件,后者用于通过调用 FileStream 类的 Dispose 方法从内存中删除 FileStream 实例。

下面,我们介绍在 ASP.NET Core 6 中处理 IDisposable 对象的四种方法。

2. 使用 “using” 语句处理 IDisposable 对象

处理 IDisposable 实例的最简单方法是使用“using”语句,它会自动调用实例上的 Dispose 方法。以下代码片段说明了这一点。

using(FileManager fileManager = new FileManager())
{
        await fileManager.Write("This is a text");
}

3. 在请求结束时处理 IDisposable 对象

在 ASP.NET Core 或 ASP.NET Core MVC 应用程序中工作时,我们可能经常需要在 HTTP 请求结束时处理对象。

HttpResponse.RegisterForDispose 方法可用于以这种方式注册 IDisposable 对象以进行处理。它接受实现 IDisposable 接口的类的实例,并确保作为参数传递给它的 IDisposable 对象随每个请求自动处理。

以下代码演示了如何使用 HttpResponse.RegisterForDispose 方法在每个 HTTP 请求结束时注册 FileManager 类的实例。

public class DefaultController: ControllerBase {
    readonly IDisposable _disposable;
    public DefaultController() {
            _disposable = new FileManager();
    }
}

4. 使用内置的 IoC 容器处理 IDisposable 对象

另一种自动处理 IDisposable 对象的方法是使用 ASP.NET Core 中的内置 IoC(控制反转)容器。您可以利用 Transient、Scoped 或 Singleton 实例来创建服务并将它们添加到内置 IoC 容器中。

将 IDisposable 对象添加到 Startup 类的 ConfigureServices 方法中的 IoC 容器,以便这些对象随每个 HTTP 请求自动处理。

5. 使用 IHostApplicationLifetime 事件处理 IDependency 对象

ASP.NET Core 有一个名为 IHostApplicationLifetime 的接口,允许您在应用程序启动或关闭时运行自定义代码。您可以利用此接口的 Register 方法来注册事件。

Startup 类的 Configure 方法可以接受以下参数:

  1. IApplicationBuilder
  2. IHostingEnvironment
  3. ILoggerFactory
  4. IHostApplicationLifetime

以下代码演示了如何使用 IHostApplicationLifetime 接口注册对象以在应用程序关闭时进行处置。

public void Configure(IApplicationBuilder app, IHostApplicationLifetime hostApplicationLifetime) {
    hostApplicationLifetime.ApplicationStopping.Register(OnShutdown);
}
private void OnShutdown() {
    // 释放对象的代码
}

最后,ASP.NET Core 6 中默认不会创建 Startup.cs。我们需要手动创建一个,然后在 Program.cs 文件中编写以下代码以指定您将在其中使用的 Startup 类应用程序。

var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureWebHostDefaults(webBuilder =>
{
    webBuilder.UseStartup<Startup>();
});
using var app = builder.Build();
app.Run();

与 Finalize 不同,我们显式使用 Dispose 方法来释放非托管资源。您应该在实现它的任何对象上显式调用 Dispose 方法,以释放该对象可能持有其引用的任何非托管资源。

参考资料:

1. C#教程

2.编程宝库

(0)

相关推荐

  • ASP.NET在VS2022中使用Dispose释放资源实例

    Dispose和Finalize是运行的 .NET 和 .NET Core 应用程序释放占用的资源的两种方法.通常,如果应用程序中有非托管资源,应该显式地释放这些资源占用的资源. 由于 Finalize的非确定性,以及在性能方面的成本很高,因此 Dispose方法的使用频率远高于 Finalize.其实,我们可以在一个实现了 IDisposable接口的类型上使用 Dispose方法. 本文中提供的代码示例均默认运行在 Visual Studio 2022. 使用 VS2022 创建 ASP.N

  • ASP.NET 使用 Dispose 释放资源的四种方法详细介绍

    目录 1. 创建一个实现 IDisposable 接口的类 2. 使用 "using" 语句处理 IDisposable 对象 3. 在请求结束时处理 IDisposable 对象 4. 使用内置的 IoC 容器处理 IDisposable 对象 5. 使用 IHostApplicationLifetime 事件处理 IDependency 对象 ASP.NET 使用 Dispose 释放资源的四种方法 Dispose 和 Finalize 是运行的 .NET 和 .NET Core

  • php 解析xml 的四种方法详细介绍

    php 解析xml 的四种方法 XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. 1. XML Expat Parser: XML Parser使用Expat XML解析器.Expat是一种基于事件的解析器,它把XML文档视为一系列事件.当某个事件发生时,它调用一个指定的函数处理它.Expat是无验证的解析器,忽略任何链接到文档的DTD.但是,如

  • java中Object类4种方法详细介绍

    目录 Object(四大方法): hashCode()方法: equals()方法: getClass()方法: toString()方法: 总结 Object(四大方法): 文章干货满满,耐性看完~~何为Object?首先先来看看官方对Object的介绍:在这里附上Java官方的查阅工具:https://docs.oracle.com/en/java/javase/17/docs/api/index.html 由官方介绍可见,object属于Java.lang包内的一个类,而且提供了很多种方法

  • Docker 网络模式(四种)详细介绍

    Docker 网络模式 本文首先介绍了Docker自身的4种网络工作方式, Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分.因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求. 四种网络模式 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: · host模式,使用--net=h

  • Java中四种引用类型详细介绍

    Java 四种引用类型 对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用. ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,

  • java向多线程中传递参数的三种方法详细介绍

    在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据.本文就以上原因介绍了几种用于向线程传递数据的方法,在下一篇文章中将介绍从线程中返回数据的方法. 欲先取之,必先予之.一般在使用线程时都需要有一些初始化数据,然后线程利用这些数据进行加工处理,并

  • Android 杀死进程几种方法详细介绍

    Android 杀死进程: 对于进程结束在开发APP应用当中还是有必要的,这里整理了三种方法,大家可以根据需求选用. 当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程. android.os.Process.killProcess(android.os.Process.myPid()) 接下来实践一下: <RelativeLayout xmlns:android="http://schemas.androi

  • asp.net后台注册js的四种方法分享

    1. 用Response.Write方法 代码如下: 复制代码 代码如下: Response.Write("<script type='text/javascript'>alert("keleyi.com");</script>"); 此方法缺陷就是不能调用脚本文件中的自定义的函数,只能调用内部函数,具体调用自定义的函数只能在Response.Write写上函数定 义,比如 复制代码 代码如下: Response.Write("&l

  • Asp.net中时间格式化的6种方法详细总结

    1. 数据控件绑定时格式化日期方法: 复制代码 代码如下: <asp:BoundColumn DataField="AddTime" HeaderText="添加时间" DataFormatString="{0:yyyy-MM-dd HH:mm}></asp:BoundColumn> <asp:BoundField DataField="AddTime" HeaderText="添加时间"

  • C# 写入XML文档三种方法详细介绍

    我在以前的博客中介绍了如何使用XmlDocument类对XML进行操作,以及如何使用LINQ to XML对XML进行操作.它们分别使用了XmlDocument类和XDocument类.在本文中,我再介绍一个类,XmlTextWriter.我们分别用这三个类将同样的xml内容写入文档,看一看哪种写法最直观.简便. 我们要写入的XML文档内容为 复制代码 代码如下: <?xml version="1.0" encoding="UTF-8"?> <Co

随机推荐