.NET 6是否有ObjectPool类,以便我可以共享我的SFtpClient?

wqlqzqxt  于 2023-03-04  发布在  .NET
关注(0)|答案(1)|浏览(96)

我想找一些关于. NET 6中的ObjectPooling的代码示例/文档。
我可以看到此exists in .NET 7 via these docs,但无法升级到. NET 7。
我确实在某个地方找到了一些代码(不,我看不清在哪里,它是在我的工作电脑上,而不是家里的这台),看起来像这样:

using System.Buffers;

var sftpObjectPool = new ObjectPool<SftpClient>(() => new SftpClient(config), 50);

var sftpClient = sftpObjectPool.Get();

await sftpClient.UploadFileAsync(..);

sftpObjectPool.Return(sftpClient);

但是我在. NET BCL中找不到这个类。
这可能吗?

anauzrmj

anauzrmj1#

文档中引用的ObjectPool<T>Microsoft.Extensions.ObjectPool包的一部分,并且可以使用相当长的一段时间。它是ASP.NET核心的依赖项(至少对于第7版),但是对于其他不基于Microsoft.NET.Sdk.Web的项目类型,您可能需要手动安装它。
根据使用情况,您的应用中使用了其他一些类。
对于软件包中的ObjectPool<T>,类似的内容可能如下所示:

var objectPool = new DefaultObjectPool<SftpClient>(
    FactoryPolicy.Create(() => new SftpClient(config)), 
    maximumRetained: 50);

class FactoryPolicy<T> : PooledObjectPolicy<T> where T : notnull
{
    private readonly Func<T> _factory;

    public FactoryPolicy(Func<T> factory)
    {
        _factory = factory;
    }

    public override T Create() => _factory();

    public override bool Return(T obj) => true;
}

class FactoryPolicy
{
    public static IPooledObjectPolicy<T> Create<T>(Func<T> factory) where T : notnull 
        => new FactoryPolicy<T>(factory);
}

相关问题