【发布时间】:2020-08-15 20:22:57
【问题描述】:
我想知道是否有一种方法可以通过 Source 对象创建IAsyncEnumerable<T> 或IAsyncEnumerator<T>,就像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,以及ChildMethod中的5和10。
【问题讨论】:
-
这可能是coroutines pattern 的一个很好的用例。
标签: c# asynchronous c#-8.0 iasyncenumerable