我正在尝试实现一个返回迭代器的异步函数。想法是这样的:
private async Task<IEnumerable<char>> TestAsync(string testString)
{
foreach (char c in testString.ToCharArray())
{
// do other work
yield return c;
}
}
但是,会出现一条错误消息,指出该函数不能是迭代器块,因为Task<IEnumerable<char>>
不是迭代器接口类型。有解决方案吗?
发布于 2017-09-13 21:04:56
这种东西的A more "batteries-included" implementation,包括语言支持,现在从C# 8.0开始可用。
现在,当至少将C# 8.0 (或更高版本)与.NET标准2.1 (或更高版本)和/或.NET核心3.0 (或更高版本)一起使用时,原始问题中的代码可能如下所示:
private async IAsyncEnumerable<char> TestAsync(string testString)
{
foreach (char c in testString.ToCharArray())
{
// do other work, which may include "await"
yield return c;
}
}
发布于 2015-10-21 06:34:37
为了详细说明前面的答案,您可以使用Reactive Extensions的Observable.Create<TResult>
系列方法来做您想做的事情。
下面是一个例子:
var observable = Observable.Create<char>(async (observer, cancel) =>
{
for (var i = 0; !cancel.IsCancellationRequested && i < 100; i++)
{
observer.OnNext(await GetCharAsync());
}
});
下面是如何在LINQPad中使用它的示例:
// Create a disposable that keeps the query running.
// This is necessary, since the observable is 100% async.
var end = Util.KeepRunning();
observable.Subscribe(
c => Console.WriteLine(c.ToString()),
() => end.Dispose());
https://stackoverflow.com/questions/23295119
复制相似问题