首页 / C# / c#-事件处理程序的“收益回报”
c#-事件处理程序的“收益回报”
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-事件处理程序的“收益回报”,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1542字,纯文字阅读大概需要3分钟。
内容图文
![c#-事件处理程序的“收益回报”](/upload/InfoBanner/zyjiaocheng/683/19da9217efdc49e0a29e0f478608b38f.jpg)
我有一个类,它在构造函数中带有一个流.然后,您可以为各种事件设置回调,然后调用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#-事件处理程序的“收益回报”全部内容,希望文章能够帮你解决c#-事件处理程序的“收益回报”所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。