我想知道是否有一种方法可以创建IAsyncEnumerable<T>
或IAsyncEnumerator<T>
通过 Source 对象创建,而不是像TaskCompletionSource
允许一个人做任务一样。特别是,TaskCompletionSource
可以像任何其他参数一样传递。
也许是这样的:
public class AsyncEnumerables {
public Task HandlerTask { get; set; }
public async Task<string> ParentMethod() {
var source = new AsyncEnumerableSource<int>();
IAsyncEnumerable asyncEnumerable = source.GetAsyncEnumerable();
HandlerTask = Task.Run(() => handleAsyncResultsAsTheyHappen(asyncEnumerable));
int n = await someOtherTask();
source.YieldReturn(n);
var r = await ChildMethod(source);
source.Complete(); // this call would cause the HandlerTask to complete.
return r;
}
private async Task<string> ChildMethod(AsyncEnumerableSource<int> source) {
source.YieldReturn(5);
await SomeOtherCall();
source.YieldReturn(10);
return "hello";
}
}
使用上面的代码,handleAsyncResultsAsTheyHappen
任务将看到传递给 YieldReturn 的任何值。所以它会看到n
from 上面的代码,以及 the5
和10
from ChildMethod
。