使用收益率延迟Azure blob存储调用-c#
我目前有一个方法,可以从Azure中提取blob文件名列表。方法如下:使用收益率延迟Azure blob存储调用-c#,c#,azure,azure-storage-blobs,ienumerable,yield,C#,Azure,Azure Storage Blobs,Ienumerable,Yield,我目前有一个方法,可以从Azure中提取blob文件名列表。方法如下: internal async Task<IEnumerable<BlobItem>> GetFiles(CloudBlobContainer container, string directoryName, bool recursive) { var results = new List<BlobItem>(); BlobContinuationToken continua
internal async Task<IEnumerable<BlobItem>> GetFiles(CloudBlobContainer container, string directoryName, bool recursive)
{
var results = new List<BlobItem>();
BlobContinuationToken continuationToken = null;
do
{
var response = await container.GetDirectoryReference(directoryName).ListBlobsSegmentedAsync(false, BlobListingDetails.None, 100, continuationToken, null, null);
continuationToken = response.ContinuationToken;
foreach (var item in response.Results)
{
if (item.GetType() != typeof(CloudBlobDirectory))
results.Add(new BlobItem(item));
else if (recursive)
results.AddRange(await GetFiles(container, ((CloudBlobDirectory)item).Prefix, recursive));
}
}
while (continuationToken != null);
return results;
}
编辑2018-11-15 从C#8开始,您将能够使用
IAsyncEnumerable
:
async IAsyncEnumerable<int> GetBigResultsAsync()
{
await foreach (var result in GetResultsAsync())
{
if (result > 20) yield return result;
}
}
IAsyncEnumerable<string> GetAsyncAnswers()
{
return AsyncEnum.Enumerate<string>(async consumer =>
{
foreach (var question in GetQuestions())
{
string theAnswer = await answeringService.GetAnswer(question);
await consumer.YieldAsync(theAnswer);
}
});
}
奇怪的是,使用收益法,执行时间从1分24秒(无收益)显著增加到了4分14秒——假设它将事情推迟到需要的时候。这是一个很棒的答案+非常感谢你,亚历克斯!!!我现在可以选择使用“ToEnumerable”或直接订阅“GetFiles”(可观察)。布里尔!!
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
async IAsyncEnumerable<int> GetBigResultsAsync()
{
await foreach (var result in GetResultsAsync())
{
if (result > 20) yield return result;
}
}
IAsyncEnumerable<string> GetAsyncAnswers()
{
return AsyncEnum.Enumerate<string>(async consumer =>
{
foreach (var question in GetQuestions())
{
string theAnswer = await answeringService.GetAnswer(question);
await consumer.YieldAsync(theAnswer);
}
});
}
public IEnumerable<BlobItem> GetFilesAsEnumerable(CloudBlobContainer container, string directoryName, bool recursive)
{
return GetFiles(container, directoryName, recursive).ToEnumerable();
}
public IObservable<BlobItem> GetFiles(CloudBlobContainer container, string directoryName, bool recursive)
{
return Observable.Create<BlobItem>(async obs =>
{
BlobContinuationToken continuationToken = null;
do
{
var response = await container.GetDirectoryReference(directoryName).ListBlobsSegmentedAsync(/*useFlatBlobListing*/ recursive, BlobListingDetails.None, 100, continuationToken, null, null);
continuationToken = response.ContinuationToken;
foreach (var item in response.Results)
{
// Only required if recursive == false
if (item.GetType() != typeof(CloudBlobDirectory))
obs.OnNext(new BlobItem(item));
}
}
while (continuationToken != null);
});
}