2012-03-15 74 views

回答

0

我不知道你是否想過你的問題,但你有沒有試過確保你的Source類的LastParseTime在創建時被設置爲0?我似乎回想起檢查沒有發生的一些問題,除非在創建Source對象時手動將LastParseTime設置爲0。 Protip:如果你使用.NET Reflector,你可以反彙編LanguageService框架的所有基類,並且很好地理解它們是如何工作的。您感興趣的類將生活在Microsoft.VisualStudio.Package.LanguageService.10.0.dll中,它應該安裝在GAC中。當我試圖弄清楚爲什麼事情在我自己的語言服務中不起作用,並且能夠在調試器中逐步完成源代碼時,我發現這是無法想象的幫助,可以緩解使用這些框架的幾乎所有的痛苦!

0

當您的Source對象被初始化時,它將以Int32.MaxValueLastParseTime開頭。引起ParseRequestParseReason.Check錯誤的代碼將檢查LastParseTime值,以查看自上次更改文本以來的時間是否小於運行解析所花費的時間(或CodeSenseDelay設置,以較大者爲準)。

處理來自ParseSource響應中的代碼應該設置LastParseTime,但據我所知,它只做如果ParseReasonCheck

當初始化您的Source時,您可以通過設置Source.LastParseTime = 0來解決此問題。即使第一個解析尚未完成,這也具有將CompletedFirstParse設置爲true的副作用。

另一種方式來解決這個問題是覆蓋Source.OnIdle火關到BeginParse()第一次調用這是我推薦的方式。

public override void OnIdle(bool periodic) 
{ 
    // Once first "Check" parse completes, revert to base implementation 
    if (this.CompletedFirstParse) 
    { 
     base.OnIdle(periodic); 
    } 
    // Same as base implementation, except we don't check lastParseTime 
    else if (!periodic || this.LanguageService == null || this.LanguageService.LastActiveTextView == null || (this.IsCompletorActive) || (!this.IsDirty || this.LanguageService.IsParsing)) 
    { 
     this.BeginParse(); 
    } 
}