private void Start() { _controlTask = Task.Factory.StartNew(() => { if (State == DispatcherState.DS_AWAITING || State == DispatcherState.DS_STOPPED) { _logger.Info("Dispatcher: Dispatcher starting"); State = DispatcherState.DS_RUNNING; var consumers = Consumers.ToArray(); consumers.Each((consumer) => consumer.Open()); consumers.Each(consumer => _tasks.TryAdd(consumer.JobId, consumer.Job)); _logger.InfoFormat("Dispatcher: Dispatcher starting {0} performers", _tasks.Count); while (!_tasks.IsEmpty) { try { var runningTasks = _tasks.Values.ToArray(); var index = Task.WaitAny(runningTasks); var stoppingConsumer = runningTasks[index]; _logger.DebugFormat("Dispatcher: Performer stopped with state {0}", stoppingConsumer.Status); var consumer = Consumers.SingleOrDefault(c => c.JobId == stoppingConsumer.Id); if (consumer != null) { _logger.DebugFormat("Dispatcher: Removing a consumer with connection name {0}", consumer.Name); consumer.Dispose(); _consumers.TryRemove(consumer.Name, out consumer); } //_tasks[index].Dispose(); //_tasks.RemoveAt(index); //_tasks.TryTake(out ) Task removedTask; _tasks.TryRemove(stoppingConsumer.Id, out removedTask); } catch (AggregateException ae) { ae.Handle( (ex) => { _logger.ErrorFormat("Dispatcher: Error on consumer; consumer shut down"); return(true); }); } } State = DispatcherState.DS_STOPPED; _logger.Info("Dispatcher: Dispatcher stopped"); } }, TaskCreationOptions.LongRunning); }
private void Start() { controlTask = Task.Factory.StartNew( () => { if (State == DispatcherState.DS_AWAITING || State == DispatcherState.DS_STOPPED) { State = DispatcherState.DS_RUNNING; logger.Info("Dispatcher: Dispatcher starting"); Consumers.Each((consumer) => consumer.Open()); Consumers.Select(consumer => consumer.Job).Each(job => tasks.Add(job)); logger.InfoFormat("Dispatcher: Dispatcher starting {0} performers", tasks.Count); while (tasks.Any()) { try { var index = Task.WaitAny(tasks.ToArray()); logger.DebugFormat("Dispatcher: Performer stopped with state {0}", tasks[index].Status); var consumer = Consumers.SingleOrDefault(c => c.JobId == tasks[index].Id); if (consumer != null) { logger.DebugFormat("Dispatcher: Removing a consumer with connection name {0}", consumer.Name); consumer.Dispose(); Consumers.Remove(consumer); } tasks[index].Dispose(); tasks.RemoveAt(index); } catch (AggregateException ae) { ae.Handle( (ex) => { logger.ErrorFormat("Dispatcher: Error on consumer; consumer shut down"); return(true); }); } } State = DispatcherState.DS_STOPPED; logger.Info("Dispatcher: Dispatcher stopped"); } }, TaskCreationOptions.LongRunning); }
private void Start() { _controlTask = Task.Factory.StartNew(() => { if (State == DispatcherState.DS_AWAITING || State == DispatcherState.DS_STOPPED) { s_logger.LogInformation("Dispatcher: Dispatcher starting"); State = DispatcherState.DS_RUNNING; var consumers = Consumers.ToArray(); consumers.Each(consumer => consumer.Open()); consumers.Each(consumer => _tasks.TryAdd(consumer.JobId, consumer.Job)); s_logger.LogInformation("Dispatcher: Dispatcher starting {Consumers} performers", _tasks.Count); while (_tasks.Any()) { try { var runningTasks = _tasks.Values.ToArray(); var index = Task.WaitAny(runningTasks); var stoppingConsumer = runningTasks[index]; s_logger.LogDebug("Dispatcher: Performer stopped with state {Status}", stoppingConsumer.Status); var consumer = Consumers.SingleOrDefault(c => c.JobId == stoppingConsumer.Id); if (consumer != null) { s_logger.LogDebug("Dispatcher: Removing a consumer with subscription name {ChannelName}", consumer.Name); if (_consumers.TryRemove(consumer.Name, out consumer)) { consumer.Dispose(); } } if (_tasks.TryRemove(stoppingConsumer.Id, out Task removedTask)) { removedTask.Dispose(); } stoppingConsumer.Dispose(); } catch (AggregateException ae) { ae.Handle(ex => { s_logger.LogError(ex, "Dispatcher: Error on consumer; consumer shut down"); return(true); }); } } State = DispatcherState.DS_STOPPED; s_logger.LogInformation("Dispatcher: Dispatcher stopped"); } }, TaskCreationOptions.LongRunning); while (State != DispatcherState.DS_RUNNING) { Task.Delay(100).Wait(); } }