我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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. 编程宝库

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

asp.net Repeater控件的说明及详细介绍及使用方法

Repeater 控件不具备内置的呈现功能,这表示用户必须通过创建模板为 Repeater 控件提供布局。当该页运行时,Repeater 控件依次通过数据源中的记录为每个记录呈现一个项。 他很简单,用起来也不够强大,但是应了那句老话,杀鸡焉
2022-06-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录