Async Задача <IEnumerable <T>> throws "не является типом интерфейса итератора" error

Следующий код throw не является типом интерфейса итератора, только когда я использую 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, я не уверен, что вызывает эту проблему.

Ответ 1

Только методы, объявляющие, что они возвращают IEnumerable<T>, IEnumerable, IEnumerator или IEnumerator<T>, могут быть реализованы с помощью блоков итератора. Это исключает все асинхронные методы.

В принципе, неясно, как они будут работать в любом случае, учитывая, что IEnumerable<T> основан на pull-based, тогда как асинхронные методы более реактивны. Кроме того, точка блока итератора заключается в том, что вызывающие могут видеть промежуточные результаты, тогда как задача, возвращаемая методом асинхронизации, не будет завершена до тех пор, пока сам асинхронный метод не завершится.

Вам понадобится альтернативный подход - будь то Rx или что-то еще. Вы можете сначала подумать не о том, как будет выглядеть реализация, но о том, что сделает вызывающий. Возможно, вы действительно хотите IEnumerable<Task<List<T>>?