public void OnTraceRecordLoadedFromSource(TraceRecord trace)
 {
     lock (ThisLock)
     {
         if (trace != null && internalCachedTraceRecords != null && trace != null && trace.TraceRecordPos != null)
         {
             if (!internalCachedTraceRecords.ContainsKey(trace.FileDescriptor.FilePath))
             {
                 internalCachedTraceRecords.Add(trace.FileDescriptor.FilePath, new Dictionary <long, TraceRecord>());
             }
             if (internalCachedTraceRecords[trace.FileDescriptor.FilePath].ContainsKey(trace.TraceRecordPos.FileOffset))
             {
                 internalCachedTraceRecords[trace.FileDescriptor.FilePath][trace.TraceRecordPos.FileOffset] = trace;
             }
             else
             {
                 if (internalCachedTraceRecordQueue != null && internalCachedTraceRecordQueue.Count >= 10000)
                 {
                     InternalTraceRecordQueueItem internalTraceRecordQueueItem = internalCachedTraceRecordQueue.Dequeue();
                     if (internalCachedTraceRecords.ContainsKey(internalTraceRecordQueueItem.filePath) && internalCachedTraceRecords[internalTraceRecordQueueItem.filePath].ContainsKey(internalTraceRecordQueueItem.fileOffset))
                     {
                         internalCachedTraceRecords[internalTraceRecordQueueItem.filePath].Remove(internalTraceRecordQueueItem.fileOffset);
                     }
                 }
                 internalCachedTraceRecords[trace.FileDescriptor.FilePath].Add(trace.TraceRecordPos.FileOffset, trace);
                 internalCachedTraceRecordQueue.Enqueue(new InternalTraceRecordQueueItem(trace.FileDescriptor.FilePath, trace.TraceRecordPos.FileOffset));
             }
         }
     }
 }
 private void InvalidateCache(string path)
 {
     lock (ThisLock)
     {
         if (internalCachedTraceRecords != null && !string.IsNullOrEmpty(path) && internalCachedTraceRecords.ContainsKey(path))
         {
             Dictionary <long, TraceRecord>       dictionary = internalCachedTraceRecords[path];
             Queue <InternalTraceRecordQueueItem> queue      = internalCachedTraceRecordQueue;
             internalCachedTraceRecordQueue = new Queue <InternalTraceRecordQueueItem>();
             while (queue.Count != 0)
             {
                 InternalTraceRecordQueueItem internalTraceRecordQueueItem = queue.Dequeue();
                 if (internalTraceRecordQueueItem.filePath != path)
                 {
                     internalCachedTraceRecordQueue.Enqueue(internalTraceRecordQueueItem);
                 }
             }
             internalCachedTraceRecords[path].Clear();
             internalCachedTraceRecords.Remove(path);
             internalTraceRecordListCache.Clear();
         }
     }
 }