From 7612e679fb0625464e4021e0cab466761f05cbbc Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Nov 2025 13:04:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20IDispose=20?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BF=9D=E8=AF=81=E9=87=8A=E6=94=BE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8F=A5=E6=9F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csharp/IP2Region.Net.Test/SearcherTest.cs | 6 +++++ .../IP2Region.Net/Abstractions/ISearcher.cs | 2 +- .../Internal/ContentCacheStrategy.cs | 7 ++++++ .../Internal/FileCacheStrategy.cs | 22 +++++++++++++++++++ .../IP2Region.Net/Internal/ICacheStrategy.cs | 2 +- binding/csharp/IP2Region.Net/XDB/Searcher.cs | 9 ++++++++ 6 files changed, 46 insertions(+), 2 deletions(-) diff --git a/binding/csharp/IP2Region.Net.Test/SearcherTest.cs b/binding/csharp/IP2Region.Net.Test/SearcherTest.cs index 1c85420..46ba960 100644 --- a/binding/csharp/IP2Region.Net.Test/SearcherTest.cs +++ b/binding/csharp/IP2Region.Net.Test/SearcherTest.cs @@ -78,6 +78,8 @@ public class SearcherTest searcher.Search("58.251.27.201"); Assert.Equal(3, searcher.IoCount); + + searcher.Dispose(); } [Fact] @@ -89,6 +91,8 @@ public class SearcherTest searcher.Search("58.251.27.201"); Assert.Equal(2, searcher.IoCount); + + searcher.Dispose(); } [Fact] @@ -100,6 +104,8 @@ public class SearcherTest searcher.Search("58.251.27.201"); Assert.Equal(0, searcher.IoCount); + + searcher.Dispose(); } [Theory] diff --git a/binding/csharp/IP2Region.Net/Abstractions/ISearcher.cs b/binding/csharp/IP2Region.Net/Abstractions/ISearcher.cs index 657716f..b8cf052 100644 --- a/binding/csharp/IP2Region.Net/Abstractions/ISearcher.cs +++ b/binding/csharp/IP2Region.Net/Abstractions/ISearcher.cs @@ -12,7 +12,7 @@ namespace IP2Region.Net.Abstractions; /// /// IP 转化为地理位置搜索器接口 /// -public interface ISearcher +public interface ISearcher : IDisposable { /// /// 搜索方法 diff --git a/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs b/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs index 693518e..020a959 100644 --- a/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs +++ b/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs @@ -14,7 +14,14 @@ class ContentCacheStrategy : FileCacheStrategy public ContentCacheStrategy(string xdbPath) : base(xdbPath) { _cacheData = base.GetData(0, (int)XdbFileStream.Length); + XdbFileStream.Close(); + XdbFileStream.Dispose(); } public override ReadOnlyMemory GetData(long offset, int length) => _cacheData.Slice((int)offset, length); + + protected override void Dispose(bool disposing) + { + base.Dispose(false); + } } diff --git a/binding/csharp/IP2Region.Net/Internal/FileCacheStrategy.cs b/binding/csharp/IP2Region.Net/Internal/FileCacheStrategy.cs index 224976a..00310e1 100644 --- a/binding/csharp/IP2Region.Net/Internal/FileCacheStrategy.cs +++ b/binding/csharp/IP2Region.Net/Internal/FileCacheStrategy.cs @@ -60,4 +60,26 @@ class FileCacheStrategy(string xdbPath) : ICacheStrategy ArrayPool.Shared.Return(buffer); } } + + /// + /// 释放文件句柄 + /// + /// + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + XdbFileStream.Close(); + XdbFileStream.Dispose(); + } + } + + /// + /// + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } } diff --git a/binding/csharp/IP2Region.Net/Internal/ICacheStrategy.cs b/binding/csharp/IP2Region.Net/Internal/ICacheStrategy.cs index 0f01d4c..3d05b31 100644 --- a/binding/csharp/IP2Region.Net/Internal/ICacheStrategy.cs +++ b/binding/csharp/IP2Region.Net/Internal/ICacheStrategy.cs @@ -7,7 +7,7 @@ namespace IP2Region.Net.Internal; -internal interface ICacheStrategy +internal interface ICacheStrategy : IDisposable { int IoCount { get; } diff --git a/binding/csharp/IP2Region.Net/XDB/Searcher.cs b/binding/csharp/IP2Region.Net/XDB/Searcher.cs index 81186b5..abccb75 100644 --- a/binding/csharp/IP2Region.Net/XDB/Searcher.cs +++ b/binding/csharp/IP2Region.Net/XDB/Searcher.cs @@ -147,4 +147,13 @@ public class Searcher(CachePolicy cachePolicy, string xdbPath) : ISearcher } return ret; } + + /// + /// + /// + public void Dispose() + { + _cacheStrategy.Dispose(); + GC.SuppressFinalize(this); + } }