Domanda

Ho trovato due modi per offrire un servizio linguistico su Internet.

Il primo modo comporta l'utilizzo di a IOleComponentManager e registrando un timer per chiamare il mio servizio durante i tempi di inattività.

Il secondo modo comporta l'inquadramento del mio servizio come agente IServiceContainer e aggiungendo a ServiceCreatorCallback "offrire il servizio su richiesta".

Presumibilmente il secondo modo è ora il “modo preferito” di fare le cose.Sfortunatamente, quando utilizzo questo metodo, OnSynchronizeDropdowns non viene mai chiamato sul mio TypeAndMembersDropdownBars implementazione.

Inoltre, quando il mio LanguageService trova errori nel file, utilizza ParseRequest.Sink.AddError() per aggiungere errori all'elenco degli errori.Quando si offre "On Demand", questi errori non vengono visualizzati nella GUI, anche se li vedo aggiunti durante il debug del codice.

So che il mio servizio linguistico è in fase di registrazione perché l'evidenziazione della sintassi, "Vai alla definizione" e "Trova tutti i riferimenti" funzionano ancora.

Ecco il codice che sto utilizzando per "offrire il mio servizio su richiesta":

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

Qualcuno può dirmi perché alcune funzionalità del mio LanguageService non funziona quando lo si offre su richiesta?Mi sto perdendo qualcosa o semplicemente non è pensato per un servizio linguistico completamente funzionale?

È stato utile?

Soluzione

Sembra che almeno la funzionalità mancante richieda l'utilizzo di IOleComponentManager metodo che registra un timer per chiamare il servizio linguistico durante periodi di inattività.

Utilizzando puntoPeek, L'ho trovato OnSynchronizeDropdowns() viene chiamato da OnCaretMoved() per sincronizzare l'elemento selezionato quando fai clic nell'editor. OnCaretMoved() stesso sembra essere chiamato solo da LanguageService.OnIdle() metodo, che credo richieda l'uso del timer di inattività.

Dopo aver scavato ulteriormente, ho anche scoperto che l'elenco degli errori richiede che il file ParseRequest.Reason essere impostato su ParseReason.Check, altrimenti ignora la chiamata.Scavando ancora nel codice, l'unico posto in cui ho trovato il motivo di analisi utilizzato era in Source.OnIdle().

Aggiornamento: Credo di aver confermato che per queste due funzionalità è necessaria la registrazione di un timer di inattività.Da MSDN in poi LanguageService.OnIdle:

NotaQuesto metodo non viene chiamato se non si imposta il tuo timer e si chiama questo metodo dal gestore del timer.

Il metodo di base chiama OnCaretMoved Se il custode si è mosso dall'ultima volta Inattivo è stato chiamato.Il metodo di base chiama quindi il metodo onidle su Fonte oggetto per la vista corrente.Se la corrente Fonte object non può essere ottenuto, il metodo di base non fa assolutamente nulla, compreso il non chiamare OnCaretMoved.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top