Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用收益率延迟Azure blob存储调用-c#_C#_Azure_Azure Storage Blobs_Ienumerable_Yield - Fatal编程技术网

使用收益率延迟Azure blob存储调用-c#

使用收益率延迟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

我目前有一个方法,可以从Azure中提取blob文件名列表。方法如下:

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-15C#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);
        });
}