public static async Task<ReadOnlyCollection<IListBlobItem>> ListBlobsSegmentedAsync( this CloudBlobContainer container, string prefix, bool useFlatBlobListing, int pageSize, BlobListingDetails details, BlobRequestOptions options, OperationContext operationContext, IProgress<IEnumerable<IListBlobItem>> progress = null, CancellationToken cancellationToken = default(CancellationToken)) { options = options ?? new BlobRequestOptions(); var results = new List<IListBlobItem>(); BlobContinuationToken continuation = null; BlobResultSegment segment; do { segment = await Task.Factory.FromAsync( (cb, state) => container.BeginListBlobsSegmented(prefix, useFlatBlobListing, details, pageSize, continuation, options, operationContext, cb, state).WithCancellation(cancellationToken), ar => container.EndListBlobsSegmented(ar), null); if (progress != null) { progress.Report(segment.Results); } results.AddRange(segment.Results); continuation = segment.ContinuationToken; } while (continuation != null); return new ReadOnlyCollection<IListBlobItem>(results); }
/// <summary> /// Returns a result segment containing a collection of blob items in the container asynchronously. /// </summary> /// <param name="blobDirectory">Cloud blob directory.</param> /// <param name="useFlatBlobListing">Whether to list blobs in a flat listing, or whether to list blobs hierarchically, by virtual directory.</param> /// <param name="blobListingDetails"> /// A <see cref="T:Microsoft.WindowsAzure.Storage.Blob.BlobListingDetails" /> enumeration describing which items to include in the listing. /// </param> /// <param name="maxResults"> /// A non-negative integer value that indicates the maximum number of results to be returned at a time, up to the /// per-operation limit of 5000. If this value is <c>null</c>, the maximum possible number of results will be returned, up to 5000. /// </param> /// <param name="continuationToken">A continuation token returned by a previous listing operation.</param> /// <param name="cancellationToken">Cancellation token.</param> /// <returns> /// The ID of the acquired lease. /// </returns> public static Task<BlobResultSegment> ListBlobsSegmentedAsync( this CloudBlobDirectory blobDirectory, bool useFlatBlobListing, BlobListingDetails blobListingDetails, int? maxResults, BlobContinuationToken continuationToken, CancellationToken cancellationToken = default (CancellationToken)) { ICancellableAsyncResult asyncResult = blobDirectory.BeginListBlobsSegmented(useFlatBlobListing, blobListingDetails, maxResults, continuationToken, null, null, null, null); CancellationTokenRegistration registration = cancellationToken.Register(p => asyncResult.Cancel(), null); return Task<BlobResultSegment>.Factory.FromAsync( asyncResult, result => { registration.Dispose(); return blobDirectory.EndListBlobsSegmented(result); }); }
public static async Task<ReadOnlyCollection<IListBlobItem>> ListBlobsSegmentedAsync( this CloudBlobContainer directory, IProgress<IEnumerable<IListBlobItem>> progress = null, CancellationToken cancellationToken = default(CancellationToken)) { var results = new List<IListBlobItem>(); BlobContinuationToken continuation = null; BlobResultSegment segment; do { segment = await Task.Factory.FromAsync( (cb, state) => directory.BeginListBlobsSegmented(continuation, cb, state).WithCancellation(cancellationToken), ar => directory.EndListBlobsSegmented(ar), null); if (progress != null) { progress.Report(segment.Results); } results.AddRange(segment.Results); continuation = segment.ContinuationToken; } while (continuation != null); return new ReadOnlyCollection<IListBlobItem>(results); }