static void Main(string[] args)
        {
            var options = new CommandlineOptions();
            if (!Parser.Default.ParseArguments(args, options))
            {
                //nonparsable arguments
                return;
            }

            var directoryPath = Path.GetFullPath(options.Path);
            var filePaths = Directory.EnumerateFiles(directoryPath);

            ulong count = 0;
            Parallel.ForEach(filePaths, path =>
            {

                var file = new TextFile(path);
                file.Parse();
                Console.WriteLine(path+": "+file.Words);
                lock (_locker)
                {
                    count += file.Words;
                }

            });

            Console.WriteLine();
            Console.WriteLine("all words in all files: " + count);

            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            var options = new CommandlineOptions();
            Parser.Default.ParseArguments(args, options);

            if(  options.Port !=0 )
            {
                StartServer(options.Port);
                return;
            }

            var directoryPath = Path.GetFullPath(options.Path);
            var filePaths = Directory.EnumerateFiles(directoryPath);

            ulong count = 0;
            var usedPorts = new List<int>();
            var random = new Random();
            Parallel.ForEach(filePaths, path =>
            {
                //processes are great, see Google Chrome
                var self = Process.GetCurrentProcess().MainModule.FileName;
                self = self.Replace(".vshost", "");
                ProcessStartInfo info = new ProcessStartInfo(self);
                int port = 12345;
                lock (_locker)
                {
                    do
                    {
                        port = random.Next(1025, 65530);
                    }
                    while (usedPorts.Contains(port));

                    info.Arguments =  "--port=" + port;
                    usedPorts.Add(port);
                }

                info.UseShellExecute = true;//just to show blinking windows
                var serverProcess = Process.Start(info);

                ChannelFactory<IServer> httpFactory =
                        new ChannelFactory<IServer>(
                          new BasicHttpBinding(),
                          new EndpointAddress(
                            "http://localhost:"+port+"/Server"));

                var server = httpFactory.CreateChannel();
                ulong words = 0;
                try
                {
                    words = server.CountWords(path);
                }
                //happens sometimes, e.g. chosen port is taken by another app..
                catch (Exception e)
                {
                    //Console.WriteLine(e.ToString());
                }
                Console.WriteLine(path + ": " + words);
                lock (_locker)
                {
                    count += words;
                }

                serverProcess.Kill();
            });

            Console.WriteLine();
            Console.WriteLine("all words in all files: " + count);

            Console.ReadKey();
        }