Nuget
Microsoft.Extensions.ObjectPool
?文章來源地址http://www.zghlxwxcb.cn/news/detail-462168.html
使用對象池的好處
減少初始化/資源分配,提高性能。這一條與線程池同理,有些對象的初始化或資源分配耗時長,復(fù)用這些對象減少初始化和資源分配。比如:我有一個執(zhí)行耗時約500毫秒,內(nèi)存空間 2KB的任務(wù)為此創(chuàng)建一個新線程異步執(zhí)行,而創(chuàng)建線程耗時1秒,內(nèi)存空間占用1MB則得不償失。
?文章來源:http://www.zghlxwxcb.cn/news/detail-462168.html
使用步驟
安裝Nuget包:Install-Package Microsoft.Extensions.ObjectPool
builder.Services.TryAddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
使用對象池的第一步是實現(xiàn)IPooledObjectPolicy接口,要告訴對象池如何創(chuàng)建需要復(fù)用的對象
IPooledObjectPolicy接口有兩個方法,
T Create()負(fù)責(zé)創(chuàng)建復(fù)用對象。
Return負(fù)責(zé)將復(fù)用的對象釋放回對象池中。如果不調(diào)用Return,表示該對象在對象池被移除。
//對象池框架接口 public interface IPooledObjectPolicy<T> where T : notnull { T Create(); bool Return(T obj); } //我的復(fù)用對象的接口實現(xiàn) public class ReuseObjectPolicy : IPooledObjectPolicy<ReuseObject> { public ReuseObject Create() => new(DateTime.Now); public bool Return(ReuseObject obj) => true; }
builder.Services.TryAddSingleton(serviceProvider => { var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>(); var policy = new ReuseObjectPolicy(); return provider.Create(policy); });
對象使用通過依賴注入獲取泛型ObjectPool對象的Get使用,關(guān)于泛型ObjectPool的定義如下
T Get()負(fù)責(zé)獲取復(fù)用對象。
Return負(fù)責(zé)將復(fù)用的對象釋放回對象池中。如果不調(diào)用Return,表示該對象在對象池被移除。
public abstract class ObjectPool<T> where T : class { public abstract T Get(); public abstract void Return(T obj); }
?
獲取ReuseObject復(fù)用對象,通過打印的創(chuàng)建事件和計數(shù)器可以知道,對象被復(fù)用了。而如果不調(diào)用Return,則會重新創(chuàng)建新的對象。
public class ReuseObject { private static int _counter = 0; public ReuseObject(DateTime time) { Time = time; Interlocked.Increment(ref _counter); Console.WriteLine($"{Time}被創(chuàng)建了{(lán)_counter}次"); } public DateTime Time { get; set; } } public class ObjectPoolController : ControllerBase {
private readonly ObjectPool<ReuseObject> _objectPool;
public ObjectPoolController(ObjectPool<ReuseObject> objectPool)
{
_objectPool = objectPool;
}
[HttpGet] public IActionResult Get() { var reuseObject = _objectPool.Get(); try { Console.WriteLine($"創(chuàng)建時間是:{reuseObject.Time}"); } finally { _objectPool.Return(reuseObject); } return Ok(); } }
?
?
?
到了這里,關(guān)于【C#/.NET】使用ASP.NET Core對象池的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!