编辑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);
}
});
}
https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/
https://archive.codeplex.com/?p=asyncenum
你需要使用
IObservable<BlobItem>
而不是
IEnumerable<BlobItem>
在这种情况下。至少在内部,这取决于你实际打电话的方式
GetFiles
.
How to yield return item when doing Task.WhenAny
或者
corresponding blog post
为了得到公认的答案。
旁注:您可能需要使用参数
useFlatBlobListing=true
ListBlobsSegmentedAsync
一些快速代码,描述了这可能看起来如何(未测试或任何东西)
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);
});
}