feat: 增加 IDispose 接口保证释放文件句柄

This commit is contained in:
Argo Zhang 2025-11-22 13:04:38 +08:00
parent 5b8b47df5e
commit 7612e679fb
6 changed files with 46 additions and 2 deletions

View File

@ -78,6 +78,8 @@ public class SearcherTest
searcher.Search("58.251.27.201"); searcher.Search("58.251.27.201");
Assert.Equal(3, searcher.IoCount); Assert.Equal(3, searcher.IoCount);
searcher.Dispose();
} }
[Fact] [Fact]
@ -89,6 +91,8 @@ public class SearcherTest
searcher.Search("58.251.27.201"); searcher.Search("58.251.27.201");
Assert.Equal(2, searcher.IoCount); Assert.Equal(2, searcher.IoCount);
searcher.Dispose();
} }
[Fact] [Fact]
@ -100,6 +104,8 @@ public class SearcherTest
searcher.Search("58.251.27.201"); searcher.Search("58.251.27.201");
Assert.Equal(0, searcher.IoCount); Assert.Equal(0, searcher.IoCount);
searcher.Dispose();
} }
[Theory] [Theory]

View File

@ -12,7 +12,7 @@ namespace IP2Region.Net.Abstractions;
/// <summary> /// <summary>
/// IP 转化为地理位置搜索器接口 /// IP 转化为地理位置搜索器接口
/// </summary> /// </summary>
public interface ISearcher public interface ISearcher : IDisposable
{ {
/// <summary> /// <summary>
/// 搜索方法 /// 搜索方法

View File

@ -14,7 +14,14 @@ class ContentCacheStrategy : FileCacheStrategy
public ContentCacheStrategy(string xdbPath) : base(xdbPath) public ContentCacheStrategy(string xdbPath) : base(xdbPath)
{ {
_cacheData = base.GetData(0, (int)XdbFileStream.Length); _cacheData = base.GetData(0, (int)XdbFileStream.Length);
XdbFileStream.Close();
XdbFileStream.Dispose();
} }
public override ReadOnlyMemory<byte> GetData(long offset, int length) => _cacheData.Slice((int)offset, length); public override ReadOnlyMemory<byte> GetData(long offset, int length) => _cacheData.Slice((int)offset, length);
protected override void Dispose(bool disposing)
{
base.Dispose(false);
}
} }

View File

@ -60,4 +60,26 @@ class FileCacheStrategy(string xdbPath) : ICacheStrategy
ArrayPool<byte>.Shared.Return(buffer); ArrayPool<byte>.Shared.Return(buffer);
} }
} }
/// <summary>
/// 释放文件句柄
/// </summary>
/// <param name="disposing"></param>
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
XdbFileStream.Close();
XdbFileStream.Dispose();
}
}
/// <summary>
/// <inheritdoc/>
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
} }

View File

@ -7,7 +7,7 @@
namespace IP2Region.Net.Internal; namespace IP2Region.Net.Internal;
internal interface ICacheStrategy internal interface ICacheStrategy : IDisposable
{ {
int IoCount { get; } int IoCount { get; }

View File

@ -147,4 +147,13 @@ public class Searcher(CachePolicy cachePolicy, string xdbPath) : ISearcher
} }
return ret; return ret;
} }
/// <summary>
/// <inheritdoc/>
/// </summary>
public void Dispose()
{
_cacheStrategy.Dispose();
GC.SuppressFinalize(this);
}
} }