当前位置:  开发笔记 > 编程语言 > 正文

等待IEnumerable项目(等待之后等待)

如何解决《等待IEnumerable项目(等待之后等待)》经验,为你挑选了1个好方法。

我有这个iterator- return类型,IEnumerable>以便以后可以等待每个项目:

private IEnumerable> GetEventsAsync(long length)
{
    var pos = _reader.BaseStream.Position;
    while (_reader.BaseStream.Position - pos < length)
    {
        yield return ReadEvent(); // this method is async
    }
}

现在,我想将其传递给构造函数。

private async Task ReadEventManagerAsync()
{
    // some other stuff
    var length = Reverse(await _reader.ReadInt32()); // bytes to read
    var events = GetEventsAsync(length); // cant await iterator. so use linq
    return new EventManager(events.Select(async e => await e).Select(x => x.Result));
}

构造函数采用此参数。

internal EventManager([NotNull, NoEnumeration]IEnumerable events) {...}

这段代码会异步运行吗?

因为即使方法被标记为异步,我也无法在lambda中等待。我试图做一些修改。

我了解为什么Select(async e => await e)返回,IEnumerable>因为async e => await e是异步方法,该返回类型必须包装在里面Task

我的问题是.Select(x => x.Result)仍会异步运行吗?因为我在此之前正在等待物品,所以这应该不是问题吧?就像写这个

await e;
return e.Result; // is it safe?

我不想使用Task.WhenAll,因为这将枚举所有内容,而这正是我要避免的事情。我想保持此迭代器不变,直到其传入构造函数。我想推迟执行。(如果无法实现,我将使用工厂方法)



1> Stephen Clea..:

这段代码会异步运行吗?

否。枚举枚举时,它将同步运行,并有可能出现死锁。

Select(async e => await e)什么也没做 与相同Select(e => e)。它是一样的await e;

整个流到的转换IEnumerable非常奇怪。也许您打算将其转换为IObservable

如果这种方法不可行,我将使用工厂方法

是的,您不能await在构造函数中使用,阻塞会导致死锁。异步工厂方法可能是您最好的选择。

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有