当前位置: 首页 > 编程语言 > C#

C#学习教程:.NET中的异步XmlReader?在

时间:2023-04-10 12:53:08 C#

.NET中共享异步XmlReader?有没有办法异步访问XmlReader?xml从许多不同的客户端(例如XMPP)进入网络;它是源源不断的...标签。我所追求的是能够使用类似BeginRead/EndRead的界面。我想出的最佳解决方案是在底层网络流上异步读取0字节,然后当一些数据到达时,调用XmlReader上的Read-但这会阻塞,直到节点中的所有数据都可用。解决方案看起来大致像这个privateStreamsyncstream;私有网络流ns;私有XmlReader阅读器;//这段代码首先运行publicvoidInit(){syncstream=Stream.Synchronized(ns);reader=XmlReader.Create(syncstream);byte[]x=newbyte[1];syncstream.BeginRead(x,0,0,newAsynchronousCallback(ReadCallback),null);}privatevoidReadCallback(IAsyncResultar){syncstream.EndRead(ar);读者.Read();//这会阻塞一段时间,直到整个节点可用//对xml节点做一些事情byte[]x=newbyte[1];syncstream.BeginRead(x,0,0,newAsynchronousCallback(ReadCallback),null);编辑:如果一个字符串包含一个完整的xml节点,这是一个可能的算法吗?FuncnodeChecker=currentBuffer=>{//如果什么都没有,则肯定没有标签if(currentBuffer=="")returnfalse;//如果我们有,坚持下去,否则传递它if(currentBuffer.Contains(""))returnfalse;如果(currentBuffer.Contains(""))返回真;//这些标签相关的东西也会抓取处理指令//i如果有一个,我们仍然有一个打开的标签if(currentBuffer.Contains(""))returnfalse;//如果有一个,我们就有了一个完整的元素。//>...if(currentBuffer.Contains(""))返回真;//如果没有,我们有一个完整的文本节点if(!currentBuffer.Contains(""))returntrue;///>和no//默认情况下,不阻塞returnfalse;};XmlReader以4kB的块进行缓冲,如果我记得几年前看到这个时,您可以将入站数据填充到4kB(恶心!),或者使用更好的解析器。我通过将JamesClark的XP(Java)作为Jabber-Net的一部分移植到C#来解决这个问题,在这里:http://code.google.com/p/jabber-net/source/browse/#svn/trunk/xpnetThis是LGPL,只处理UTF8,没有打包使用,几乎没有文档,所以不推荐使用。?最简单的方法是将它放在另一个线程上,可能是一个线程池,这取决于它保持活动状态的时间。(不要将线程池线程用于真正长时间运行的任务)。.NET4.5中的XmlReader具有涉及IO的大多数方法的异步版本。在此处查看示例代码。这很棘手,因为XmlReader不提供任何异步接口。我不确定当您要求它读取0个字节时,BeginRead是如何异步的——它也可以立即调用回调,然后在调用Read时阻塞。这可能与直接调用Read然后在线程池中调度下一个Read相同(例如,使用QueueWorkItem。最好在网络流上使用BeginRead来读取数据,例如10kB块(你不会阻塞任何线程,同时系统等待数据)。当您收到一个块时,您将其复制到某个本地MemoryStream,您的XmlReader将从该MemoryStream读取数据。这仍然是有问题的——复制10kB的数据并多次调用Read,最后一次调用会阻塞。然后,您可能需要复制较小的数据块以取消阻止挂起的读取调用。完成后,您可以再次启动新的BeginRead调用以异步读取大部分数据。老实说,这听起来很复杂,所以如果有人提出更好的答案,我会很感兴趣。但是,它至少为您提供了一些有保证的异步操作,这些操作需要一些时间并且在此期间不会阻塞任何线程(这是异步编程的基本目标)。(旁注:您可以尝试使用F#异步工作流编写此代码,因为它们使异步代码更加简单。我描述的技术即使在F#中也很棘手)看起来DOTNET4.5有一个boolAsync属性,在3.5中不可用。也许这对你有用?您是否在寻找XamlReader.LoadAsync方法之类的东西?异步XAML加载操作最初将返回一个纯粹是根对象的对象。异步地,XAML解析然后继续,并且任何子对象都填充在根下。以上就是C#学习教程:AsynchronousXmlReaderin.NET?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: