/// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            random = new Random();

            //Initialize Other Classes
            DebugShapeRenderer.Initialize(GraphicsDevice);
            MessageBus.Initialize();
            consoleWriter = new ConsoleWriter();
            ShipManager.Initialize();

            //HazardManager.Initialize();
            GenericManager <Hazard> .Initialize();

            Camera.Initialize(GraphicsDevice);
            skybox = new Skybox(Content);
            player1InputManager = new InputManager(Keys.Space, Keys.A, Keys.D, Keys.E, Keys.W, Keys.S, Keys.LeftShift, Keys.F1, Keys.F2);
            CollisionManager.Initialize();
            collidables = new List <ICollidable>();

            ExplosionManager.Initialize();

            ScoreManager.Initialize();

            MessageBus.InsertNewMessage(new ConsoleMessage("Game Initiated!"));

            base.Initialize();
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Hello GodSharp.MessageBus!");

            string cmd = null;

            MessageBus.Initialize(x =>
            {
                x.AddMemory();
            });

            MessageBus.Subscribe(MessageHandler10);
            MessageBus.Subscribe(MessageHandler11, "handler1");
            MessageBus.Subscribe(MessageHandler12, "handler2");

            MessageBus.Subscribe <TestMessage>(MessageHandler20);
            MessageBus.Subscribe <TestMessage>(MessageHandler21, "handler1");
            MessageBus.Subscribe <TestMessage>(MessageHandler22, "handler2");

            CancellationTokenSource cts = new CancellationTokenSource();

            Task task = new Task(async() =>
            {
                try
                {
                    Random random = new Random((int)DateTime.Now.Ticks);

                    while (!cts.IsCancellationRequested)
                    {
                        int i = random.Next(1, 7);
                        Console.WriteLine($"send {i}");

                        switch (i)
                        {
                        case 1:
                            MessageBus.Publish();
                            break;

                        case 2:
                            MessageBus.Publish("handler1");
                            break;

                        case 3:
                            MessageBus.Publish("handler2");
                            break;

                        case 4:
                            MessageBus.Publish(new TestMessage());
                            break;

                        case 5:
                            MessageBus.Publish(new TestMessage(), "handler1");
                            break;

                        case 6:
                            MessageBus.Publish(new TestMessage(), "handler2");
                            break;

                        default:
                            continue;
                        }

                        await Task.Delay(20);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

                Console.WriteLine("task is cancel");
            });

            task.Start();

            do
            {
                cmd = Console.ReadLine();
                if (string.IsNullOrWhiteSpace(cmd))
                {
                    continue;
                }
            } while (cmd?.ToLower() != "q");

            Console.WriteLine("waitting to cancel");
            cts.Cancel();

            Console.ReadLine();
        }