Asynchroner XmlReader in .NET?

Gibt es eine Möglichkeit, asynchron auf einen XmlReader zuzugreifen? Die XML-Datei wird von vielen verschiedenen Clients wie in XMPP aus dem Netzwerk eingespeist. es ist ein ständiger Strom von<action>...</action> tags.

Was ich danach bin, ist in der Lage zu sein, eine BeginRead / EndRead-ähnliche Schnittstelle zu verwenden. Die beste Lösung, die ich gefunden habe, ist das asynchrone Lesen von 0 Bytes im zugrunde liegenden Netzwerk-Stream. Wenn einige Daten eintreffen, rufen Sie Read on the XmlReader auf. Dies wird jedoch blockiert, bis alle Daten vom Knoten empfangen wurden wird verfügbar. Diese Lösung sieht ungefähr so aus

private Stream syncstream;
private NetworkStream ns;
private XmlReader reader;

//this code runs first
public void Init()
{
    syncstream = Stream.Synchronized(ns);
    reader = XmlReader.Create(syncstream);
    byte[] x = new byte[1];
    syncstream.BeginRead(x, 0, 0, new AsynchronousCallback(ReadCallback), null);
}

private void ReadCallback(IAsyncResult ar)
{
    syncstream.EndRead(ar);
    reader.Read(); //this will block for a while, until the entire node is available
    //do soemthing to the xml node
    byte[] x = new byte[1];
    syncstream.BeginRead(x, 0, 0, new AsynchronousCallback(ReadCallback), null);
}

BEARBEITEN: Dies ist ein möglicher Algorithmus zum Ermitteln, ob eine Zeichenfolge einen vollständigen XML-Knoten enthält.

Func<string, bool> nodeChecker = currentBuffer =>
                {
                    //if there is nothing, definetly no tag
                    if (currentBuffer == "") return false;
                    //if we have <![CDATA[ and not ]]>, hold on, else pass it on
                    if (currentBuffer.Contains("<![CDATA[") && !currentBuffer.Contains("]]>")) return false;
                    if (currentBuffer.Contains("<![CDATA[") && currentBuffer.Contains("]]>")) return true;
                    //these tag-related things will also catch <? ?> processing instructions
                    //if there is a < but no >, we still have an open tag
                    if (currentBuffer.Contains("<") && !currentBuffer.Contains(">")) return false;
                //if there is a <...>, we have a complete element.
                //>...< will never happen because we will pass it on to the parser when we get to >
                if (currentBuffer.Contains("<") && currentBuffer.Contains(">")) return true;
                //if there is no < >, we have a complete text node
                if (!currentBuffer.Contains("<") && !currentBuffer.Contains(">")) return true;
                //> and no < will never happen, we will pass it on to the parser when we get to >
                //by default, don't block
                return false;
            };

Antworten auf die Frage(6)

Ihre Antwort auf die Frage