public FunctionDispatcher(IOptions <ScriptJobHostOptions> scriptHostOptions,
                                  IMetricsLogger metricsLogger,
                                  IEnvironment environment,
                                  IScriptJobHostEnvironment scriptJobHostEnvironment,
                                  IScriptEventManager eventManager,
                                  ILoggerFactory loggerFactory,
                                  ILanguageWorkerChannelFactory languageWorkerChannelFactory,
                                  IOptions <LanguageWorkerOptions> languageWorkerOptions,
                                  IWebHostLanguageWorkerChannelManager webHostLanguageWorkerChannelManager,
                                  IJobHostLanguageWorkerChannelManager jobHostLanguageWorkerChannelManager,
                                  IOptions <ManagedDependencyOptions> managedDependencyOptions,
                                  IFunctionDispatcherLoadBalancer functionDispatcherLoadBalancer)
        {
            _metricsLogger                       = metricsLogger;
            _scriptOptions                       = scriptHostOptions.Value;
            _environment                         = environment;
            _scriptJobHostEnvironment            = scriptJobHostEnvironment;
            _webHostLanguageWorkerChannelManager = webHostLanguageWorkerChannelManager;
            _jobHostLanguageWorkerChannelManager = jobHostLanguageWorkerChannelManager;
            _eventManager                        = eventManager;
            _workerConfigs                       = languageWorkerOptions.Value.WorkerConfigs;
            _managedDependencyOptions            = managedDependencyOptions;
            _logger = loggerFactory.CreateLogger <FunctionDispatcher>();
            _languageWorkerChannelFactory = languageWorkerChannelFactory;
            _workerRuntime = _environment.GetEnvironmentVariable(LanguageWorkerConstants.FunctionWorkerRuntimeSettingName);

            var processCount = _environment.GetEnvironmentVariable(LanguageWorkerConstants.FunctionsWorkerProcessCountSettingName);

            _maxProcessCount = (processCount != null && int.Parse(processCount) > 1) ? int.Parse(processCount) : 1;
            _maxProcessCount = _maxProcessCount > _maxAllowedProcessCount ? _maxAllowedProcessCount : _maxProcessCount;
            _functionDispatcherLoadBalancer = functionDispatcherLoadBalancer;

            State = FunctionDispatcherState.Default;

            _workerErrorSubscription = _eventManager.OfType <WorkerErrorEvent>()
                                       .Subscribe(WorkerError);

            _rpcChannelReadySubscriptions = _eventManager.OfType <RpcJobHostChannelReadyEvent>()
                                            .ObserveOn(NewThreadScheduler.Default)
                                            .Subscribe(AddOrUpdateWorkerChannels);

            _shutdownStandbyWorkerChannels = ShutdownWebhostLanguageWorkerChannels;
            _shutdownStandbyWorkerChannels = _shutdownStandbyWorkerChannels.Debounce(5000);
        }