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); + } }