/// <summary>
        /// Only call this method on an another thread
        /// Starts the thread running the match
        /// </summary>
        public void ThreadStart()
        {
            MatchGameMessageHandler     matchGameHandler = new MatchGameMessageHandler(logger, this);
            MatchServerCoreEventHandler eventHandler     = new MatchServerCoreEventHandler();

            server         = new ServerCore(matchGameHandler, new ServerConnectionInfo(port), logger, eventHandler);
            pingDeterminer = new PingDeterminer(server.clientManager, server.messageSender, miliSecondPerTick, clock, updater);
            matchGameHandler.Init(serverExtensions, clock, eventHandler);
            var time = clock.GetTime();

            while (server.clientManager.GetClients().Count > 0 || timeClientsHaveToConnectWithin > clock.GetTime())
            {
                updater.Update();
                server.Update();
                System.Threading.Thread.Sleep(miliSecondPerTick);
            }

            logger.Log("Match ended");
        }
 /// <summary>
 /// Setup extensions
 /// </summary>
 /// <param name="serverExtensions">Extensions</param>
 /// <param name="matchClock">Clock of the match</param>
 /// <param name="serverCoreEventHandler">Eventhandler of the ServerCore</param>
 internal void Init(List <IServerExtension> serverExtensions, Clock matchClock, MatchServerCoreEventHandler serverCoreEventHandler)
 {
     commandHandler.Add(new MessageHandler_Request_JoinGame(logger, matchThread.GetServer().messageSender, matchThread, serverExtensions, matchGameEventWrapper));
     commandHandler.Add(new MessageHandler_ServerRoundTrip_Ping(logger, matchThread.GetServer().messageSender, matchThread, serverExtensions));
     foreach (var extension in serverExtensions)
     {
         foreach (var msgHandler in extension.CreateMessageHandlers(matchThread.GetServer(), matchThread.pingDeterminer, matchGameEventWrapper, matchClock))
         {
             commandHandler.Add(msgHandler);
         }
         extension.SetupSubscribers(matchThread.GetServer(), serverCoreEventHandler);
     }
 }