Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AsyncResourcePool

Thread-safe, non-blocking, managed pool of re-usable resources, with a specified minimum and optional maximum number of resources, and optional expiry time for resources to be cleaned up if not used for a time.

Installation

dotnet add package AsyncResourcePool

Options

Behaviour of AsyncResourcePool can be specified using AsyncResourcePoolOptions.

PropertyDefaultDescription
MinNumResourcesN/AThe minimum number of resources that will be maintained by the pool. This number of resources will be created regardless of whether or not they are requested. If a resource is requested an allocated, an additional resource will be created to maintain the pool size.
MaxNumResourcesint.MaxValueThe maximum number of resources that the pool is allowed to create.
ResourcesExpireAfternullIf a resource is unused for this time, it will be dispsosed. If this causes the number of available resources to drop below the minimum, additional resources will be created to replace the disposed ones.
MaxNumResourceCreationAttempts3Maximum number of attempts for creating a resource before an exception is thrown and passed back to the requestor
ResourceCreationRetryInterval1 secondAmount of time to wait after a failed resource creation attempt before trying again

Example usage: Connection Pool for Snowflake Connector for .NET

https://github.com/snowflakedb/snowflake-connector-net

  1. Define a ConnectionPool class which consumes AsyncResourcePool internally
publicsealedclassConnectionPool{privatereadonlyIAsyncResourcePool<SnowflakeDbConnection>_resourcePool;publicConnectionPool(stringconnectionString){varconnectionFactory=GetConnectionFactoryFunc(connectionString);varasyncResourcePoolOptions=newAsyncResourcePoolOptions(minNumResources:20,resourcesExpireAfter:TimeSpan.FromMinutes(15));_resourcePool=newAsyncResourcePool<SnowflakeDbConnection>(connectionFactory,asyncResourcePoolOptions);}publicTask<ReusableResource<SnowflakeDbConnection>>Get(CancellationTokencancellationToken)=>_resourcePool.Get(cancellationToken);publicvoidDispose()=>_resourcePool.Dispose();privatestaticFunc<Task<SnowflakeDbConnection>>GetConnectionFactoryFunc(stringconnectionString){returnasync()=>{varconn=newSnowflakeDbConnection{ConnectionString=connectionString};awaitconn.OpenAsync();returnconn;};}}
  1. Optionally register ConnectionPool as Singleton in dependency injection configuration
services.AddSingleton<ConnectionPool>(sp => new ConnectionPool(...));
  1. Consume ConnectionPool
publicclassConnectionConsumer{privatereadonlyConnectionPool_connectionPool;publicConnectionConsumer(ConnectionPoolconnectionPool){_connectionPool=connectionPool;}publicasyncTaskDoSomething(CancellationTokencancellationToken){using(varreusableConnection=await_connectionPool.Get(cancellationToken)){varconnection=reusableConnection.Resource;// Do something with the connection}}}

About

Thread-safe, non-blocking, managed pool of re-usable resources, with a specified minimum and optional maximum number of resources, and optional expiry time for resources to be cleaned up if not used for a time

Resources

Stars

5 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages