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) { _logger.Info("Dispatcher: Dispatcher starting"); State = DispatcherState.DS_RUNNING; var consumers = Consumers.ToArray(); 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); }
public override async Task <bool> ConsumeDroplet(T droplet) { if (Consumers.Count == 0) { return(false); } if (Current >= Consumers.Count) { Current = 0; } bool ret = await Consumers.ToArray()[Current].ConsumeDroplet(droplet); return(ret || ++Current != Consumers.Count); }
public override async Task <bool> ConsumeDroplet(T droplet) { if (Consumers.Count == 0) { return(false); } if (Current >= Consumers.Count) { Current = 0; AllFalse = true; } bool ret = await Consumers.ToArray()[Current++].ConsumeDroplet(droplet); if (ret) { AllFalse = false; } else if (AllFalse && Current == Consumers.Count) { return(false); } return(true); }
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(); } }