anchor.diff:  
       let legacyProjectSites = ConcurrentDictionary<ProjectId, IProjectSite>()
   
  -    let cache = Dictionary<ProjectId, Project * FSharpParsingOptions * FSharpProjectOptions>()
  -    let singleFileCache = Dictionary<DocumentId, VersionStamp * FSharpParsingOptions * FSharpProjectOptions>()
  +    let cache = ConcurrentDictionary<ProjectId, Project * FSharpParsingOptions * FSharpProjectOptions>()
  +    let singleFileCache = ConcurrentDictionary<DocumentId, VersionStamp * FSharpParsingOptions * FSharpProjectOptions>()
   
       let rec tryComputeOptionsByFile (document: Document) (ct: CancellationToken) =
           async {
  
positive.code:                             reply.Reply None
  
                  | FSharpProjectOptionsMessage.ClearOptions(projectId) ->
                      cache.Remove(projectId) |> ignore
                      legacyProjectSites.TryRemove(projectId) |> ignore
                  | FSharpProjectOptionsMessage.ClearSingleFileOptionsCache(documentId) ->
                      singleFileCache.Remove(documentId) |> ignore
          }
  
      let agent = MailboxProcessor.Start((fun agent -> loop agent), cancellationToken = cancellationTokenSource.Token)
  
negative.code: 
              | true, (fileStamp2, parsingOptions, projectOptions) ->
                  if fileStamp <> fileStamp2 then
                      singleFileCache.TryRemove(document.Id) |> ignore
                      return! tryComputeOptionsByFile document ct
                  else
                      return Some(parsingOptions, projectOptions)
  