/// <summary> /// Call back to add the kernel to the available child kernels /// </summary> /// <param name="kernelWrapper">The wrapped kernel to mark available</param> private void AddFreeChildKernels(IKernelWrapper kernelWrapper) { lock (this.obj) { this.availableChildKernels.Enqueue(kernelWrapper); } }
/// <summary> /// Gets a child kernel for event. Child kernels are re-used to help with performance since creating child kernels for every event causes performance issues. /// </summary> /// <param name="evnt">The event that the kernel will have context of.</param> /// <returns>A kernel wrapper that wraps the actual kernel.</returns> public IKernelWrapper CreateChildKernel(Event evnt) { lock (this.obj) { // Attempt to get an available child kernel to re-use or create a new one if none exist IKernelWrapper eventKernelWrapper = null; while (eventKernelWrapper == null) { eventKernelWrapper = this.availableChildKernels.Any() ? this.availableChildKernels.Dequeue() : this.CreateNewChildKernel(); } // Rebind the log context for the current event eventKernelWrapper.Kernel.Rebind <ILogContext>().ToConstant(new LogContext(evnt)); return(eventKernelWrapper); } }