async Task <IEnumerable <T >> throws"不是迭代器接口类型"错误

Sar*_*nan 13 c# asynchronous

以下代码抛出不是迭代器接口类型,只有当我使用async await并包装IEnumerablewith Task时.如果我删除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);

    }
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 16

只有方法才宣布他们返回IEnumerable<T>,IEnumerable,IEnumerator或者IEnumerator<T>可以用迭代块来实现.这排除了所有异步方法.

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

你需要采用另一种方法 - 无论是Rx还是其他方法.您可能希望首先考虑的不是实现的内容,而是调用者将要执行的操作.也许你真的想要一个IEnumerable<Task<List<T>>


Lys*_*Lys 11

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