/// <summary> /// Helper method to invoke <see cref="E_ResourcePooling.UseResourceAsync{TResource, T}(AsyncResourcePool{TResource}, Func{TResource, Task{T}}, CancellationToken)"/> with callback which synchronously uses the resource. /// </summary> /// <typeparam name="TResource">The type of resources handled by this pool.</typeparam> /// <param name="pool">This <see cref="AsyncResourcePool{TResource}"/>.</param> /// <param name="user">The callback which synchronously uses resource.</param> /// <param name="token">The optional <see cref="CancellationToken"/> to use during resource acquirement.</param> /// <returns>A task which completes after resource has been returned to the pool.</returns> /// <exception cref="NullReferenceException">If this <see cref="AsyncResourcePool{TResource}"/> is <c>null</c>.</exception> public static async Task UseResourceAsync <TResource>(this AsyncResourcePool <TResource> pool, Action <TResource> user, CancellationToken token) { await pool.UseResourceAsync(resource => { user(resource); return(TaskUtils.CompletedTask); }, token); }
/// <summary> /// Helper method to invoke <see cref="E_ResourcePooling.UseResourceAsync{TResource, T}(AsyncResourcePool{TResource}, Func{TResource, Task{T}}, CancellationToken)"/> with callback which asynchronously returns value of type <typeparamref name="T"/>. /// </summary> /// <typeparam name="TResource">The type of resources handled by this pool.</typeparam> /// <typeparam name="T">The type of return value of asynchronous callback.</typeparam> /// <param name="pool">This <see cref="AsyncResourcePool{TResource}"/>.</param> /// <param name="user">The callback which asynchronously returns some value of type <typeparamref name="T"/>.</param> /// <param name="token">The optional <see cref="CancellationToken"/> to use during asynchronous operations inside <paramref name="user"/> callback.</param> /// <returns>A task which returns the result of <paramref name="user"/> on its completion.</returns> /// <exception cref="NullReferenceException">If this <see cref="AsyncResourcePool{TResource}"/> is <c>null</c>.</exception> public static async Task <T> UseResourceAsync <TResource, T>(this AsyncResourcePool <TResource> pool, Func <TResource, Task <T> > user, CancellationToken token) { var retVal = default(T); await pool.UseResourceAsync(async resource => { retVal = await user(resource); }, token); return(retVal); }
/// <summary> /// Takes an existing resource or creates a new one, runs the given asynchronous callback for it, and returns it back into the pool. /// </summary> /// <param name="pool">This <see cref="AsyncResourcePool{TResource}"/>.</param> /// <param name="user">The asynchronous callback to use the resource.</param> /// <param name="token">The optional <see cref="CancellationToken"/> to use during asynchronous operations inside <paramref name="user"/> callback.</param> /// <returns>A task which completes when <paramref name="user"/> callback completes and resource is returned back to the pool.</returns> /// <exception cref="NullReferenceException">If this <see cref="AsyncResourcePool{TResource}"/> is <c>null</c>.</exception> public static async Task UseResourceAsync <TResource>(this AsyncResourcePool <TResource> pool, Func <TResource, Task> user, CancellationToken token) { var usage = pool.GetResourceUsage(token); try { await usage.AwaitForResource(); await user(usage.Resource); } finally { await usage.DisposeAsync(); } }
/// <summary> /// Convenience method to asynchronously get <see cref="AsyncResourceUsage{TResource}"/> from this <see cref="AsyncResourcePool{TResource}"/> by first calling <see cref="AsyncResourcePool{TResource}.GetResourceUsage"/> and then <see cref="AsyncResourceUsage{TResource}.AwaitForResource"/>. /// </summary> /// <typeparam name="TResource">The type of resources handled by this pool.</typeparam> /// <param name="pool">This <see cref="AsyncResourcePool{TResource}"/>.</param> /// <param name="token">The <see cref="CancellationToken"/> to bind returned <see cref="AsyncResourceUsage{TResource}"/> to.</param> /// <returns>Asynchronously returns <see cref="AsyncResourceUsage{TResource}"/> which has its <see cref="AsyncResourceUsage{TResource}.Resource"/> property ready to use without further awaiting.</returns> /// <exception cref="NullReferenceException">If this <see cref="AsyncResourcePool{TResource}"/> is <c>null</c>.</exception> public static async Task <AsyncResourceUsage <TResource> > GetResourceUsageAsync <TResource>(this AsyncResourcePool <TResource> pool, CancellationToken token) { var retVal = pool.GetResourceUsage(token); await retVal.AwaitForResource(); return(retVal); }
/// <summary> /// Creates a new instance of <see cref="DefaultAsyncResourcePoolUser{TResource}"/> with given parameters. /// </summary> /// <param name="pool">The resource pool.</param> /// <param name="token">The cancellation token.</param> /// <exception cref="ArgumentNullException">If <paramref name="pool"/> is <c>null</c>.</exception> public DefaultAsyncResourcePoolUser(AsyncResourcePool <TResource> pool, CancellationToken token) { this._pool = ArgumentValidator.ValidateNotNull(nameof(pool), pool); this.Token = token; }