Frage

Ich habe zwei Möglichkeiten gefunden, einen Sprachdienst im Internet anzubieten.

Der erste Weg beinhaltet die Verwendung von a IOleComponentManager und Registrieren eines Timers, um meinen Dienst während Leerlaufzeiten anzurufen.

Der zweite Weg beinhaltet die Darstellung meines Dienstes als IServiceContainer und Hinzufügen von a ServiceCreatorCallback „die Dienstleistung auf Abruf anzubieten“.

Angeblich ist der zweite Weg mittlerweile der „bevorzugte Weg“, Dinge zu erledigen.Leider, wenn ich diese Methode verwende, OnSynchronizeDropdowns wird bei mir nie angerufen TypeAndMembersDropdownBars Implementierung.

Darüber hinaus, wenn meine LanguageService Findet Fehler in der Datei, die es verwendet ParseRequest.Sink.AddError() um Fehler zur Fehlerliste hinzuzufügen.Wenn ich „On Demand“ anbiete, werden diese Fehler nicht in der GUI angezeigt, obwohl ich sehe, dass sie hinzugefügt werden, wenn ich den Code debugge.

Ich weiß, dass mein Sprachdienst registriert wird, da die Syntaxhervorhebung, „Gehe zu Definition“ und „Alle Referenzen suchen“ weiterhin funktionieren.

Hier ist der Code, den ich verwende, um „meinen Service auf Abruf anzubieten“:

IServiceContainer serviceContainer = this as IServiceContainer;
ServiceCreatorCallback callback = new ServiceCreatorCallback(CreateLanguageService);
serviceContainer.AddService(typeof(MyLanguageService), callback, true);

Kann mir jemand sagen, warum einige meiner Funktionen? LanguageService funktioniert nicht, wenn man es auf Abruf anbietet?Übersehe ich etwas oder ist dieser Weg einfach nicht für einen voll funktionsfähigen Sprachdienst gedacht?

War es hilfreich?

Lösung

Es sieht so aus, als ob zumindest die fehlende Funktionalität die Verwendung von erfordert IOleComponentManager Methode, die einen Timer registriert, um den Sprachdienst aufzurufen Leerlaufzeiten.

Benutzen dotPeek, Ich habe das gefunden OnSynchronizeDropdowns() wird angerufen von OnCaretMoved() zum Synchronisieren des ausgewählten Elements, wenn Sie im Editor herumklicken. OnCaretMoved() selbst scheint nur von der aufgerufen zu werden LanguageService.OnIdle() Methode, die meiner Meinung nach die Verwendung des Leerlauf-Timers erfordert.

Nachdem ich etwas weiter gegraben hatte, stellte ich auch fest, dass die Fehlerliste dies erfordert ParseRequest.Reason eingestellt werden ParseReason.Check, andernfalls wird der Anruf ignoriert.Als ich den Code noch einmal durchforstete, fand ich den einzigen Ort, an dem der Parse-Grund verwendet wurde, in Source.OnIdle().

Aktualisieren: Ich glaube, ich habe bestätigt, dass für diese beiden Funktionen die Registrierung eines Leerlauf-Timers erforderlich ist.Ab MSDN LanguageService.OnIdle:

NotizDiese Methode wird nur aufgerufen, es sei denn, Sie richten Ihren eigenen Timer ein und nennen diese Methode vom Timer -Handler.

Die Basismethodenaufrufe OnCaretMoved Wenn sich die Pflege seit dem letzten Mal bewegt hat Im Leerlauf hieß.Die Basismethode ruft dann die Onidle -Methode auf der Quelle Objekt für die aktuelle Ansicht.Wenn der Strom QuelleObjekt kann nicht erhalten werden, die Basismethode tut überhaupt nichts, einschließlich nicht Anruf OnCaretMoved.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top