- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否有办法创建 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
从上面的代码,以及
5
和
10
来自
ChildMethod
.
最佳答案
如果您可以构建代码以利用 yield return
,情况会好得多。和 await foreach
.例如,这段代码几乎做了同样的事情:
public async Task Consume()
{
var source = ParentMethod();
HandlerTask = Task.Run(async () => { await foreach (var item in source) { Console.WriteLine(item); } });
}
public async IAsyncEnumerable<int> ParentMethod()
{
await Task.Yield();
yield return 13;
await foreach (var item in ChildMethod())
yield return item;
}
private async IAsyncEnumerable<int> ChildMethod()
{
yield return 5;
await Task.Yield();
yield return 10;
}
TaskCompletionSource<T>
保存结果,即
T
(或异常(exception))。它充当一个容器。可以在等待任务之前设置结果。这与“异步可枚举源”相同 - 在从中取出任何项目之前,您需要它能够保存结果。 “异步可枚举源”需要保存多个结果 - 在这种情况下,是一个集合。
public async Task<string> ParentMethod()
{
var source = Channel.CreateUnbounded<int>();
var sourceWriter = source.Writer;
IAsyncEnumerable<int> asyncEnumerable = source.Reader.ReadAllAsync();
HandlerTask = Task.Run(async () => { await foreach (var item in asyncEnumerable) Console.WriteLine(item); });
await Task.Yield();
await sourceWriter.WriteAsync(13);
var r = await ChildMethod(sourceWriter);
sourceWriter.Complete();
return r;
}
private async Task<string> ChildMethod(ChannelWriter<int> sourceWriter)
{
await sourceWriter.WriteAsync(5);
await Task.Yield();
await sourceWriter.WriteAsync(10);
return "hello";
}
关于c# - IAsyncEnumerable 或 IAsyncEnumerator 的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61540896/
我有以下界面: public interface IValidationSystem { IAsyncEnumerable ValidateAsync(T obj); } 我正在尝试以这种方式
我想知道是否有办法创建 IAsyncEnumerable或 IAsyncEnumerator通过 Source 对象,而不是像 TaskCompletionSource允许一个人为任务做。特别是Tas
正如标题所说,我必须执行以下功能: public async IAsyncEnumerable GetByPipeline(int pipelineId, [EnumeratorCancell
C# 8 添加了对异步迭代器 block 的支持,因此您可以等待并返回 IAsyncEnumarator 而不是 IEnumerable: public async IAsyncEnumerable
我正在尝试使用基于 IAsyncEnumerable 的 API 包装基于事件的异步订阅 API。 .基本上沿着以下路线: async IAsyncEnumerable ReadAll() {
我们有这样的代码: var intList = new List{1,2,3}; var asyncEnumerables = intList.Select(Foo); private async I
我有两种方法连接到 Foo 的两个不同来源s 返回两个 IAsyncEnumerable .我需要获取所有 Foo s 来自两个来源,然后才能处理它们。 问题 :我想同时(异步)查询两个源,即。不等S
我想知道是否有一种方法可以编写一个函数来“传递”一个 IAsyncEnumerable ......也就是说,该函数将调用另一个 IAsyncEnumerable 函数并产生所有结果而无需编写 for
我正在构建一个客户端,用于持续使用数据源中的新记录。集成是基于拉取的,我的客户定期查询数据源以获取新记录。我使用 IAsyncEnumerable 作为这个连续的新记录流的返回类型。以下是该方法的要点
我有一个这样写的界面: public interface IItemRetriever { public IAsyncEnumerable GetItemsAsync(); } 我想编写一个不
这个问题的答案可能是不可能,但问题是:假设您有一个 C# 方法来使用 TextReader 中的行返回 IAsyncEnumerable .你如何确保什么时候DisposeAsync在 IAsyncE
这个问题的答案可能是不可能,但问题是:假设您有一个 C# 方法来使用 TextReader 中的行返回 IAsyncEnumerable .你如何确保什么时候DisposeAsync在 IAsyncE
我正在使用 EF Core 3.1 和 Postgresql 对数据库运行一个查询,该查询有时会根据请求的参数返回较大的结果集。我使用 Async Enumerable 来流式传输结果,有时可能需要一
我想对一个方法进行单元测试,该方法调用返回 IAsyncEnumerable 的服务的另一个方法.我创建了一个模拟服务 Mock我想设置这个模拟,但我不知道该怎么做。是否可以 ?是否有其他单元测试方法
我有一个 IAsyncEnumerable,它返回本质上是 Key/IEnumerable 的序列。对。我有代码使用这个和其他类似的枚举,假设它将接收一个唯一的键集合。但是我的一个数据源不遵守此约束。
这个问题在这里已经有了答案: How to implement an efficient WhenEach that streams an IAsyncEnumerable of task resu
我有一种情况需要从多个 IAsyncEnumerable 源接收数据。为了提高性能,它应该以并行方式执行。 我已经使用 AsyncAwaitBestPractices 编写了这样的代码来实现这个目标,
我有一个简单的场景,我有一个具有以下方法的类: public async IAsyncEnumerable GetEntities(IQueryOptions options){ if(!vali
我正在尝试检索使用 C# 8.0 中新的 AsyncEnumerables 分页的数据。回到同步 IEnumerable 世界,代码看起来像这样: private IEnumerable Exampl
运行 IAsyncEnumerable 的枚举两次不可能? 一次CountAsync已运行,await foreach不会枚举任何项目。为什么?AsyncEnumerator 上似乎没有重置方法. v
我是一名优秀的程序员,十分优秀!