/// <summary>
        /// Initializes the application.
        /// </summary>
        public void Initialize()
        {
            if (State.IsInitialized)
            {
                throw new InvalidOperationException($"You shouldn't call {nameof(Initialize)} more than once.");
            }

            if (!State.IsPreInitialized)
            {
                throw new InvalidOperationException($"You must call {nameof(PreInitialize)} before calling '{nameof(Initialize)}'.");
            }

            InitializeActivity.Start();

            CoreStartup.Initialize(InitializeViewServices);

            Logger = GetOrCreateLogger(ServiceProvider);

            OnInitialized(ServiceProvider);

            InitializeActivity.Stop();

            State.IsInitialized = true;

            Logger.LogInformation("Initialized startup.");
        }
        /// <summary>
        /// Pre-initializes the application.
        /// This must be called as early as possible.
        /// </summary>
        public void PreInitialize()
        {
            if (State.IsPreInitialized)
            {
                throw new InvalidOperationException($"You shouldn't call {nameof(PreInitialize)} more than once.");
            }

            PreInitializeActivity.Start();

            CoreStartup.PreInitialize();

            PreInitializeActivity.Stop();

            State.IsPreInitialized = true;
        }
        /// <summary>
        /// Starts the application.
        /// This method can be called multiple times.
        /// </summary>
        /// <returns><see cref="Task"/></returns>
        public async Task Start()
        {
            if (!State.IsInitialized)
            {
                throw new InvalidOperationException($"You must call {nameof(Initialize)} before calling '{nameof(Start)}'.");
            }

            Logger.LogDebug("Starting startup.");

            var isFirstLoad = !State.IsStarted;

            if (isFirstLoad)
            {
                StartActivity.Start();
            }

            var coreStart = CoreStartup.Start();
            var viewStart = StartViewServicesWithLogs(ServiceProvider, isFirstLoad);

            await Task.WhenAll(coreStart, viewStart);

            if (isFirstLoad)
            {
                StartActivity.Stop();

                State.IsStarted = true;
            }

            Logger.LogInformation("Started startup.");

            async Task StartViewServicesWithLogs(IServiceProvider services, bool isFirstStart)
            {
                Logger.LogDebug($"Starting view services (isFirstStart: {isFirstStart}).");

                await StartViewServices(services, isFirstStart);

                Logger.LogInformation("Started view services.");
            }
        }