最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET Core中的對象池化技術詳解

 更新時間:2024年01月22日 10:40:44   作者:rjcql  
這篇文章主要為大家詳細介紹了ASP.NET Core中的對象池化技術的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

寫在前面

Microsoft.Extensions.ObjectPool 是 ASP.NET Core 基礎結構的一部分,當對象的初始化成本較高,并且可能被頻繁使用時,才適合采用對象池技術;被ObjectPool管理的對象不會進入垃圾回收,使用時通過由實例對象實現(xiàn)的Get()方法,從對象池中借出對象,用完之后調用Return(T obj)方法,將對象還回去。也可以在Return(T obj)方法中設置判斷條件,僅允許特定的對象進入對象池。

通過NuGet 獲取 Microsoft.Extensions.ObjectPool 類庫

代碼實現(xiàn)

using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.ObjectPool;
using System.Security.Cryptography;
using System.Text;
 
var builder = WebApplication.CreateBuilder(args);
 
// DefaultPooledObjectPolicy: 默認的策略,繼承抽象類PooledObjectPolicy
builder.Services.TryAddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
 
builder.Services.TryAddSingleton<ObjectPool<ReusableBuffer>>(serviceProvider =>
{
    var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();
    var policy = new DefaultPooledObjectPolicy<ReusableBuffer>();
    return provider.Create(policy);
});
 
builder.Services.TryAddSingleton<ObjectPool<Person>>(serviceProvider => {
    var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();
    var policy = new PersonPoolPolicy();
    return provider.Create(policy);
});
 
builder.Services.TryAddSingleton<ObjectPool<StringBuilder>>(serviceProvider =>
{
    var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();
    var policy = new StringBuilderPooledObjectPolicy();
    return provider.Create(policy);
});
 
var app = builder.Build();
 
// config middleware
app.UseMiddleware<BirthdayMiddleware>();
 
app.MapGet("/", () => "Hello rjcql!");
 
// return the SHA256 hash of a word 
http://localhost:5128/hash/xxxx
app.MapGet("/hash/{word}", (string word, ObjectPool<ReusableBuffer> bufferPool) =>
{
 
    var buffer = bufferPool.Get();
    try
    {
        // Set the buffer data to the ASCII values of a word
        for (var i = 0; i < word.Length; i++)
        {
            buffer.Data[i] = (byte)word[i];
        }
 
        Span<byte> hash = stackalloc byte[32];
        SHA256.HashData(buffer.Data.AsSpan(0, word.Length), hash);
        return "Hash: " + Convert.ToHexString(hash);
    }
    finally
    {
        // Data is automatically reset because this type implemented IResettable
        bufferPool.Return(buffer);
    }
});
 
app.MapGet("/create/{name}", (string name, ObjectPool<Person> personPool) =>
{
    var person = personPool.Get();
    try
    {
        person.Id = Guid.NewGuid().ToString("N");
        var lastName = person.Name; // 這個是上一個對象的值
        person.Name = name;
        return $"{person.Id}:{person.Name}, {lastName}";
    }
    finally
    {
        // 根據條件回收
        personPool.Return(person);
    }
});
 
app.Run();
 
public class ReusableBuffer : IResettable
{
    public byte[] Data { get; } = new byte[1024 * 1024]; // 1 MB
 
    public bool TryReset()
    {
        Array.Clear(Data);
        return true;
    }
}
 
public class Person
{
    public string Id { get; set; }
 
    public string Name { get; set; }
}
 
public class PersonPoolPolicy : PooledObjectPolicy<Person>
{
    public override Person Create()
    {
        return new Person { Id = "", Name = "rjcql" };
    }
 
    public override bool Return(Person p)
    {
        if (p.Name != "rjcql")
        {
            // 不允許其他名稱的對象放入對象池
            return false;
        }
        return true;
    }
}
 
/// <summary>
/// 創(chuàng)建中間件
/// </summary>
public class BirthdayMiddleware
{
    private readonly RequestDelegate _next;
 
    public BirthdayMiddleware(RequestDelegate next)
    {
        _next = next;
    }
 
    public async Task InvokeAsync(HttpContext context, ObjectPool<StringBuilder> builderPool)
    {
        var stringBuilder = builderPool.Get();
        try
        {
            stringBuilder.Append("Hi");
            // 在中間干點啥別的
            // await context.Response.WriteAsync(stringBuilder.ToString());
            await _next.Invoke(context);
        }
        finally // 即使出錯也要保證歸還對象
        {
            builderPool.Return(stringBuilder);
        }
    }
}

調用示例

因為設置了回收條件,所以只有名字為rjcql的對象才會被回收,所以每次調用都先把rjcql對象取出。

到此這篇關于ASP.NET Core中的對象池化技術詳解的文章就介紹到這了,更多相關.NET Core對象池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

瓦房店市| 会同县| 德钦县| 阿克苏市| 大足县| 永泰县| 新营市| 绩溪县| 武川县| 罗田县| 宁强县| 西宁市| 太白县| 太白县| 繁昌县| 繁昌县| 林州市| 凤阳县| 东乡族自治县| 新蔡县| 二连浩特市| 卫辉市| 云安县| 凌海市| 淳化县| 鹤山市| 新闻| 遂平县| 新邵县| 勐海县| 神池县| 横峰县| 新兴县| 桐城市| 博白县| 宁明县| 台州市| 邳州市| 新巴尔虎左旗| 启东市| 西充县|