【发布时间】:2014-07-20 08:06:08
【问题描述】:
我有以下 WebApi 方法,它从 RavenDB 返回一个无限的结果流:
public IEnumerable<Foo> Get()
{
var query = DocumentSession.Query<Foo, FooIndex>();
using (var enumerator = DocumentSession.Advanced.Stream(query))
while (enumerator.MoveNext())
yield return enumerator.Current.Document;
}
现在我想让它异步。天真的方法当然行不通:
public async Task<IEnumerable<Location>> Get()
{
var query = AsyncDocumentSession.Query<Foo, FooIndex>();
using (var enumerator = await AsyncDocumentSession.Advanced.StreamAsync(query))
while (await enumerator.MoveNextAsync())
yield return enumerator.Current.Document;
}
...因为方法不能既是异步又是迭代器。
【问题讨论】:
-
您可以实现自己的迭代器。 但是,在迭代器上调用
MoveNext也必须是异步的——这意味着你不能实现IEnumerable<T>,你必须定义你自己的接口。而且您也无法在foreach循环中使用该迭代器。 -
是的,所有这些限制都是正确的。由于我只是返回这个(将由 WebApi 序列化),我不需要很大的灵活性。也许实现一个理解
Task<IAsyncEnumerator<StreamResult<T>>>的 MediaTypeFormatter -
@noseratio,问题类似,但不是重复的。
-
@noseratio 建议的解决方案将适用。但是由于我使用的是Web Api,所以我有机会直接使用格式化程序来支持IAsyncEnumerator,所以我可以避免使用助手。使用 yield 是一种解决方案,而不是要求。
标签: c# asp.net-web-api async-await ravendb