异步任务<ienumerable <t>&gt; throws“不是迭代器接口类型”错误</ienumerable <t>

时间:2014-02-26 08:54:05

标签: c# asynchronous

以下代码仅在我使用async await并包装IEnumerable时抛出 不是迭代器接口类型 与任务。如果我删除async await,我可以使用IEnumerable<List<T>>

private async Task<IEnumerable<List<T>>> GetTableDataAsync<T>(CloudTable cloudTable, TableQuery<T> tableQuery)
        where T : ITableEntity, new()
    {
        TableContinuationToken contineousToken = null;
        do
        {
            var currentSegment = await GetAzureTableDateAsync(cloudTable, tableQuery, contineousToken);
            contineousToken = currentSegment.ContinuationToken;
            yield return currentSegment.Results;

        } while (contineousToken != null);

    }

虽然我可以考虑使用Rx,但我不确定是什么导致了这个问题。

2 个答案:

答案 0 :(得分:16)

只有声明返回IEnumerable<T>IEnumerableIEnumeratorIEnumerator<T>的方法才能使用迭代器块实现。这排除了所有异步方法。

基本上不清楚它们是如何工作的,因为IEnumerable<T>是基于拉式的,而异步方法更具反应性。此外,迭代器块的要点是调用者可以看到中间结果 - 而异步方法返回的任务在异步方法本身完成之前不会完成。

你需要寻找另一种方法 - 无论是Rx还是其他方法。您可能想要首先考虑的不是实现的外观,而是调用者将会做什么。也许你真的想要一个IEnumerable<Task<List<T>>

答案 1 :(得分:1)

旧问题,并且接受的答案是正确的,但是现在使用c#8,引入了IAsyncEnumerable。因此,您应该使用IasyncEnumerable而不是IEnumerable。请参阅https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#asynchronous-streams

上的文档
相关问题