예제 #1
0
 /// <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);
 }
예제 #2
0
    /// <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);
    }
예제 #3
0
    /// <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();
        }
    }
예제 #4
0
    /// <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);
    }
예제 #5
0
 /// <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;
 }