Esempio n. 1
0
        public ProcessHostManager(string hostname, string username, string password)
        {
            _hostname = hostname;
            _username = username;
            _password = password;

            AssembliesPreLoader.Reload();

            var token = _shutdown.Token;

            Task.Run(
                () =>
            {
                while (!token.IsCancellationRequested)
                {
                    lock (_locker)
                    {
                        foreach (ManagedPlugin managedPlugin in _managedPlugins)
                        {
                            if (!_hostsDictionary.TryGetValue(managedPlugin.QueueCode, out IProcessHost host))
                            {
                                host = ProcessHostFactory.GetPluginHost(_hostname, _username, _password, managedPlugin.RequestCode, managedPlugin.IsSynchronous);
                                host.Run();
                                _hostsDictionary.GetOrAdd(managedPlugin.QueueCode, host);
                                continue;
                            }

                            if (string.IsNullOrEmpty(host.CloseReason))
                            {
                                continue;
                            }

                            _hostsDictionary.TryRemove(host.QueueCode, out host);
                        }
                    }

                    lock (_locker)
                    {
                        foreach (string key in _hostsDictionary.Keys)
                        {
                            if (!_managedPlugins.Any(m => m.QueueCode == key))
                            {
                                IProcessHost host;
                                _hostsDictionary.TryRemove(key, out host);
                            }
                        }
                    }

                    _ping.WaitOne(_pingInterval);
                }
            },
                token
                );
        }