我有一个类,构造函数需要传入一个流(stream)。你可以为各种事件设置回调函数,然后调用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();
}
}
目前我的解决方案不是很好,是将所有的Things放入一个列表中,然后由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
对象保存到列表中。
StartProcessing
同步解析整个流,定期通过事件处理程序丢弃已解析的项? - D StanleyStartProcessing
在内部是以异步方式工作的吗?这似乎是一种奇怪的 API 设计。 - Berin Loritsch