static void Main(string[] args)
        {
            for (int i = 0; i < args.Length; i++)
            {
                switch (args[i])
                {
                default:
                    Console.WriteLine("Unkown argument {0}", args[i]);
                    break;

                case "-cachedir":
                    cachePath = args[++i];
                    break;

                case "-dl":
                case "-download":
                    downloadCache = true;
                    break;

                case "-minimums":
                case "-weights":
                case "-w":
                    weightPath = args[++i];
                    break;
                }
            }


            using (redisManager = new PooledRedisClientManager())
            {
                //Load the weights
                Weights weights = new Weights();
                weights.Load(weightPath);

                //Prepare and initialize the cache
                CacheProcessor cacheProcessor = new CacheProcessor(redisManager.GetClient(), weights, cachePath);
                cacheProcessor.UpdateRedisCacheAsync(downloadCache).Wait();

                //Save the weights again
                weights.Save(weightPath);

                //Prepare the processor and start the main ;
                var tokenSource = new CancellationTokenSource();
                var processor   = new ImageProcessor(redisManager, TimeSpan.FromSeconds(10), weights);
                var listenTask  = processor.ListenAsync(tokenSource.Token);

                //get our own client and do our own loop
                HandleCli(redisManager, weights);

                Console.WriteLine("Left CLI");
                tokenSource.Cancel();
                listenTask.Wait();

                //Cleanup
                Console.WriteLine("Cleanup");
                processor.Dispose();
                tokenSource.Dispose();
            }
        }
        static void HandleCli(PooledRedisClientManager manager, Weights weights)
        {
            bool abort = false;

            while (!abort)
            {
                string   line  = Console.ReadLine();
                string[] parts = line.Split(' ');
                switch (parts[0])
                {
                default:
                    Console.WriteLine("Dont know what that is? {0}", line);
                    break;

                case "quit":
                case "close":
                case "stop":
                case "exit":
                    abort = true;
                    break;



                case "a":
                case "add":
                    using (var redis = manager.GetClient())
                        redis.AddRangeToList(ImageProcessor.PENDING_KEY, parts.Skip(1).ToList());
                    break;



                case "w":
                case "weight":
                    if (double.TryParse(parts[2], out var weight))
                    {
                        weights.Set(parts[1].ToUpperInvariant(), weight);
                        weights.Save(weightPath);
                        Console.WriteLine("Weights set");
                    }
                    else
                    {
                        Console.WriteLine("Failed to turn " + parts[2] + " into a number");
                    }
                    break;
                }
            }
        }