private void FileSystemProcessorOnSnapshotComputed(object sender, SnapshotComputedResult e) { var fileSystemTreeComputed = new FileSystemTreeComputed { OperationId = e.OperationInfo.OperationId, Error = ErrorResponseHelper.CreateErrorResponse(e.Error) }; if (e.PreviousSnapshot != null) { fileSystemTreeComputed.OldVersion = e.PreviousSnapshot.Version; fileSystemTreeComputed.NewVersion = e.NewSnapshot.Version; } _typedEventSender.SendEventAsync(fileSystemTreeComputed); }
private void FileSystemProcessorOnSnapshotComputed(object sender, SnapshotComputedResult e) { if (e.Error != null) { return; } _taskQueue.Enqueue(ComputeNewStatedId, () => ComputeNewState(e.PreviousSnapshot, e.NewSnapshot, e.FullPathChanges)); // Enqueue a GC at this point makes sense as there might be a lot of // garbage to reclaim from previous file contents stored in native heap. // By performin a full GC and waiting for finalizer, we ensure that (most) // orphan SafeHandles are released in a timely fashion. We enqueue a // separate task to ensure there is no potential state keeping these // variables alive for slightly too long. _taskQueue.Enqueue(GarbageCollectId, () => { Logger.LogMemoryStats(); GC.Collect(GC.MaxGeneration); GC.WaitForPendingFinalizers(); Logger.LogMemoryStats(); }); }