private void RunSmartWorkersInPriorityOrder(SmartWorker worker, VisualCounter[] counters)
		{
			while (true)
			{
				var item = counters
					.Select((counter, i) => new Tuple<int, VisualCounter>(i, counter))
					.Where(x => x.Item2.Counter != x.Item2.MaxWorkers)
					.OrderBy(x => x.Item2.Counter)
					.FirstOrDefault();

				if (item != null)
				{
					worker.Execute(counters[item.Item1]);
				}
			}
		}
		private void RunSmartWorkersInSequence(SmartWorker worker, VisualCounter[] counters)
		{
			var index = RandomNumber.Next();

			while (true)
			{
				worker.Execute(counters[index]);

				if (++index > 24)
					index = 0;
			}
		}
		private void RunSmartWorkersInRandom(SmartWorker worker, VisualCounter[] counters)
		{
			while (true)
			{
				var index = RandomNumber.Next();
				worker.Execute(counters[index]);
			}
		}
		private void RunSmartWorker(object state)
		{
			var castState = state as State;
			var counters = castState.Counters;
			var worker = new SmartWorker();
			
			Algorithm algorithm = null;
			var algorithmList = castState.AlgorithmList;
			algorithmList.Parent.Invoke(new MethodInvoker(delegate()
			{
				algorithm = algorithmList.SelectedItem as Algorithm;
			}));

			algorithm.Function(worker, counters);
		}