Pergunta

Encontrei duas maneiras de oferecer um serviço linguístico na Internet.

A primeira maneira envolve usar um IOleComponentManager e registrar um cronômetro para ligar para meu serviço durante os tempos de inatividade.

A segunda maneira envolve considerar meu serviço como um IServiceContainer e adicionando um ServiceCreatorCallback para “oferecer o serviço sob demanda”.

Supostamente, a segunda maneira é agora a “maneira preferida” de fazer as coisas.Infelizmente, quando uso esse método, OnSynchronizeDropdowns nunca é chamado pelo meu TypeAndMembersDropdownBars implementação.

Além disso, quando meu LanguageService encontra erros no arquivo, ele usa ParseRequest.Sink.AddError() para adicionar erros à lista de erros.Ao oferecer "On Demand", esses erros não aparecem na GUI, embora eu os veja sendo adicionados quando depuro o código.

Eu sei que meu serviço de linguagem está sendo registrado porque o realce de sintaxe, "Ir para definição" e "Localizar todas as referências" ainda funcionam.

Aqui está o código que estou usando para "oferecer meu serviço sob demanda":

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

Alguém pode me dizer por que algumas funcionalidades do meu LanguageService não funciona ao oferecê-lo sob demanda?Estou faltando alguma coisa ou essa forma não é destinada a um serviço de linguagem totalmente funcional?

Foi útil?

Solução

Parece que pelo menos a funcionalidade ausente requer o uso do IOleComponentManager método que registra um temporizador para chamar o serviço de linguagem durante períodos ociosos.

Usando dotPeek, Eu achei aquilo OnSynchronizeDropdowns() é chamado de OnCaretMoved() para sincronizar o item selecionado quando você clica no editor. OnCaretMoved() em si parece ser chamado apenas do LanguageService.OnIdle() método, que acredito requer o uso do temporizador ocioso.

Depois de pesquisar um pouco mais, também descobri que a lista de erros exige que o ParseRequest.Reason ser definido para ParseReason.Check, caso contrário, ele ignora a chamada.Pesquisando um pouco mais o código, o único lugar onde descobri que o motivo da análise estava sendo usado foi em Source.OnIdle().

Atualizar: Acredito ter confirmado que o registro de um temporizador ocioso é necessário para essas duas funcionalidades.Do MSDN em diante LanguageService.OnIdle:

ObservaçãoEste método não é chamado, a menos que você configure seu próprio cronômetro e chame esse método do manipulador do timer.

O método base chama OnCaretMoved Se o cuidador se move desde a última vez OnIdle foi chamado.O método base chama o método onidle no Fonte objeto para a visualização atual.Se a corrente FonteObjeto não pode ser obtido, o método base não faz nada, incluindo não ligar OnCaretMoved.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top