gpt4 book ai didi

c# - 来自事件处理程序的 "yield return"

转载 作者:太空狗 更新时间:2023-10-30 00:49:25 24 4
gpt4 key购买 nike

我有一个在构造函数中接受流的类。然后您可以为各种事件设置回调,然后调用 StartProcessing。问题是我想从一个应该返回 IEnumerable 的函数中使用它。

例子:

public class Parser
{
public Parser(System.IO.Stream s) { // saves stream and does some set up }
public delegate void OnParsedHandler(List<string> token);
public event OnParsedHandler OnParsedData;
public void StartProcessing()
{
// reads stream and makes callback when it has a whole record
}
}

public class Application
{
public IEnumerable<Thing> GetThings(System.IO.Stream s)
{
Parser p = new Parser(s);
p.OnParsedData += (List<string> str) =>
{
Thing t = new Thing(str[0]);
// here is where I would like to yield
// but I can't
yield return t;
};


p.StartProcessing();
}
}

现在我的解决方案(不是很好)是将所有事物放入由 lambda 捕获的列表中,然后在调用 StartProcessing 后迭代它们。

public class Application
{
public IEnumerable<Thing> GetThings(System.IO.Stream s)
{
Parser p = new Parser(s);
List<Thing> thingList = new List<Thing>();

p.OnParsedData += (List<string> str) =>
{
Thing t = new Thing(str[0]);
thingList .Add(t);
};


p.StartProcessing();
foreach(Thing t in thingList )
{
yield return t;
}
}
}

这里的问题是,现在我必须将所有 Thing 对象保存到列表中。

最佳答案

你在这里遇到的问题是你根本没有“拉”机制,你试图从解析器中推送数据。如果解析器要向您推送数据,而不是让调用者拉取数据,则 GetThings 应该返回一个 IObservable,而不是一个 IEnumerable,因此调用者可以在数据准备就绪时使用它。

如果这里有一个拉机制真的很重要,那么 Parser 不应该触发一个事件来指示它有新数据,而是调用者应该能够向它请求新数据让它得到它;它应该返回所有已解析的数据,或者它自己返回一个 IEnumerable

关于c# - 来自事件处理程序的 "yield return",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38254628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com