ASP.NET在VS2022中使用Dispose釋放資源實例
Dispose
和Finalize
是運行的 .NET 和 .NET Core 應(yīng)用程序釋放占用的資源的兩種方法。通常,如果應(yīng)用程序中有非托管資源,應(yīng)該顯式地釋放這些資源占用的資源。
由于 Finalize
的非確定性,以及在性能方面的成本很高,因此 Dispose
方法的使用頻率遠(yuǎn)高于 Finalize
。其實,我們可以在一個實現(xiàn)了 IDisposable
接口的類型上使用 Dispose
方法。
本文中提供的代碼示例均默認(rèn)運行在 Visual Studio 2022。
使用 VS2022 創(chuàng)建 ASP.NET Core 項目
我們在 Visual Studio 2022 中創(chuàng)建一個 ASP.NET Core 項目。按照以下步驟在 Visual Studio 2022 中創(chuàng)建一個新的 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) 根據(jù)您的偏好,可選擇選中 “Place solution and project in the same directory” 復(fù)選框。
- 7) 點擊下一步。
- 8) 在接下來顯示的 “Additional Information” 窗口中,從頂部的下拉列表中選擇 .NET 6.0 作為目標(biāo)框架。將 “Authentication Type” 保留為 “None”(默認(rèn))。確保選中 “Use controllers ...” 選項。
- 9) 確保未選中 “Enable Docker,”、“Configure for HTTPS” 和 “Enable Open API Support” 復(fù)選框,因為我們不會在此處使用任何這些功能。您也可以選擇取消選中 “Use controllers(取消選中以使用最少的 API)” 復(fù)選框,因為我們將創(chuàng)建自己的控制器。
- 10) 單擊創(chuàng)建。
這將在 Visual Studio 2022 中創(chuàng)建一個新的 ASP.NET Core 6 Web API 項目。我們將在本文的后續(xù)部分中使用該項目來說明 Dispose
的用法。
1. 創(chuàng)建一個實現(xiàn) IDisposable 接口的類
我們現(xiàn)在將創(chuàng)建一個實現(xiàn) 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
類實現(xiàn) IDisposable
接口并包含兩個方法:Write
和 Dispose
。前者用于將文本異步寫入文件,后者用于通過調(diào)用 FileStream
類的 Dispose
方法從內(nèi)存中刪除 FileStream
實例。
下面,我們介紹在 ASP.NET Core 6 中處理 IDisposable
對象的四種方法。
2. 使用 “using” 語句處理 IDisposable 對象
處理 IDisposable
實例的最簡單方法是使用“using”語句,它會自動調(diào)用實例上的 Dispose
方法。以下代碼片段說明了這一點。
using(FileManager fileManager = new FileManager()) { await fileManager.Write("This is a text"); }
3. 在請求結(jié)束時處理 IDisposable 對象
在 ASP.NET Core 或 ASP.NET Core MVC 應(yīng)用程序中工作時,我們可能經(jīng)常需要在 HTTP 請求結(jié)束時處理對象。
HttpResponse.RegisterForDispose
方法可用于以這種方式注冊 IDisposable
對象以進(jìn)行處理。它接受實現(xiàn) IDisposable
接口的類的實例,并確保作為參數(shù)傳遞給它的 IDisposable
對象隨每個請求自動處理。
以下代碼演示了如何使用 HttpResponse.RegisterForDispose
方法在每個 HTTP 請求結(jié)束時注冊 FileManager
類的實例。
public class DefaultController: ControllerBase { readonly IDisposable _disposable; public DefaultController() { _disposable = new FileManager(); } }
4. 使用內(nèi)置的 IoC 容器處理 IDisposable 對象
另一種自動處理 IDisposable
對象的方法是使用 ASP.NET Core 中的內(nèi)置 IoC(控制反轉(zhuǎn))容器。您可以利用 Transient
、Scoped
或 Singleton
實例來創(chuàng)建服務(wù)并將它們添加到內(nèi)置 IoC 容器中。
將 IDisposable
對象添加到 Startup
類的 ConfigureServices
方法中的 IoC 容器,以便這些對象隨每個 HTTP 請求自動處理。
5. 使用 IHostApplicationLifetime 事件處理 IDependency 對象
ASP.NET Core 有一個名為 IHostApplicationLifetime
的接口,允許您在應(yīng)用程序啟動或關(guān)閉時運行自定義代碼。您可以利用此接口的 Register
方法來注冊事件。
Startup
類的 Configure
方法可以接受以下參數(shù):
- IApplicationBuilder
- IHostingEnvironment
- ILoggerFactory
- IHostApplicationLifetime
以下代碼演示了如何使用 IHostApplicationLifetime
接口注冊對象以在應(yīng)用程序關(guān)閉時進(jìn)行處置。
public void Configure(IApplicationBuilder app, IHostApplicationLifetime hostApplicationLifetime) { hostApplicationLifetime.ApplicationStopping.Register(OnShutdown); } private void OnShutdown() { // 釋放對象的代碼 }
最后,ASP.NET Core 6 中默認(rèn)不會創(chuàng)建 Startup.cs。我們需要手動創(chuàng)建一個,然后在 Program.cs 文件中編寫以下代碼以指定您將在其中使用的 Startup 類應(yīng)用程序。
var builder = WebApplication.CreateBuilder(args); builder.Host.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); using var app = builder.Build(); app.Run();
與 Finalize 不同,我們顯式使用 Dispose 方法來釋放非托管資源。您應(yīng)該在實現(xiàn)它的任何對象上顯式調(diào)用 Dispose 方法,以釋放該對象可能持有其引用的任何非托管資源。
參考資料:
1. C#教程
2. 編程寶庫
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
答你所問 .NET小常識 方便學(xué)習(xí)asp.net的朋友
這篇文章主要介紹了.NET小常識,對于想學(xué)習(xí).net的朋友有個參考,一些問答與基礎(chǔ)介紹,對于剛開始接觸.net的朋友很有幫助,下面大家一起了解下吧2012-05-05通過VS中的數(shù)據(jù)源選擇對話框簡單實現(xiàn)數(shù)據(jù)庫連接配置
通過VS中的數(shù)據(jù)源選擇對話框簡單實現(xiàn)數(shù)據(jù)庫連接配置...2007-02-02.Net行為型設(shè)計模式之觀察者模式(Observer)
這篇文章介紹了.Net行為型設(shè)計模式之觀察者模式(Observer),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解
本文主要介紹Button、LinkButton和ImageButton 三種控件的使用方法,并一一舉例演示它們的用法,希望對大家有所幫助。2016-04-04.Net行為型設(shè)計模式之狀態(tài)模式(State)
這篇文章介紹了.Net行為型設(shè)計模式之狀態(tài)模式(State),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05Asp.net中Request.Url的各個屬性對應(yīng)的意義介紹
網(wǎng)絡(luò)上關(guān)于Request.Url的說明已經(jīng)很多也很豐富了,但是自己還是實踐了一下,看看最終的結(jié)果與網(wǎng)絡(luò)上的是否一致2012-05-05Linux Ubuntu系統(tǒng)上手動安裝.NET Core SDK的方法
.NET Core是一個開源通用的開發(fā)框架,支持跨平臺,即支持在Window,macOS,Linux等系統(tǒng)上的開發(fā)和部署,并且可以在硬件設(shè)備,云服務(wù),和嵌入式/物聯(lián)網(wǎng)方案中進(jìn)行使用。下面這篇文章將給大家詳細(xì)介紹關(guān)于在Linux Ubuntu系統(tǒng)上手動安裝.NET Core SDK的方法。2016-12-12