2016-07-18 19 views
0

Code unten verwenden Auswertungen mit SaxonCA APIC# Cache Saxon Compiler und Ausführbare Objekte

Task newTask = Task.Run(() => 
{ 
    Processor processor = new Processor(); 
    DocumentBuilder documentBuilder = processor.NewDocumentBuilder(); 
    documentBuilder.IsLineNumbering = true; 
    documentBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll; 
    XQueryCompiler compiler = processor.NewXQueryCompiler(); 
    string query = BuildXqueryString(); 

    if (!String.IsNullOrEmpty(query)) 
    { 
     XQueryExecutable executable = compiler.Compile(query); 
     XQueryEvaluator evaluator = executable.Load(); 
     evaluator.ContextItem = documentBuilder.Build(xmlNode); 
     var evaluations = evaluator.Evaluate(); 
    } 
} 

Abfragen (XQuery) sind konstant und ändern sich nie zu laufen, bis es neue Build ist. Der obige Code wird für verschiedene Dokumente parallel ausgeführt. Wollte überprüfen, ob es eine Möglichkeit gibt, das Compiler/Evaluator-Objekt zwischenzuspeichern, um Abfragebewertungen für jedes von uns verarbeitete Dokument zu vermeiden.

Jede Hilfe wäre willkommen.

Antwort

0

Das XQueryExecutable ist unveränderlich und threadsicher, sodass Sie es sicher zwischenspeichern können, beispielsweise indem Sie eine (threadsichere) Zuordnung oder Hashtabelle von der Abfragezeichenfolge zu XQueryExecutable führen. Die einzige Einschränkung besteht darin, dass Sie die Art ändern müssen, wie Sie das Processor-Objekt instanziieren: Anstatt jedes Mal, wenn Sie eine Abfrage ausführen, einen neuen Prozessor zu erstellen, sollten Sie ein einzelnes Processor-Objekt für die gesamte Anwendung haben, da die Abfrage kompiliert wurde Dokument muss unter der Kontrolle des gleichen Prozessors gebaut werden.

Der XQueryCompiler ist seriell wiederverwendbar, aber da das ErrorList-Objekt während einer Kompilierung aktualisiert wird, sollte es nicht in mehr als einem Thread gleichzeitig verwendet werden. Daher finden Sie es möglicherweise am einfachsten, bei jeder Kompilierung einer Abfrage einen neuen XQueryCompiler zu erstellen.

+0

Danke Michael. Wird versuchen, die Anwendung so zu ändern, dass sie einen einzelnen Prozessor verwendet und XQueryExecutable zwischenspeichert. –

+0

Nach dem Erstellen eines Prozesses für die App und Caching von XQueryExecutable funktioniert die Anwendung und die Leistung wurde verbessert. Danke –

+0

Gut. Bitte klicken Sie auf das Häkchen, um die Antwort als akzeptiert zu markieren, dies hilft anderen Lesern, die später darauf kommen. –