protected virtual void GenerateDatabase(PythonTypeDatabaseCreationRequest request, Action <int> onExit = null)
        {
            WatchingLibrary = false;
            _generating     = true;

            PythonTypeDatabase.GenerateAsync(request).ContinueWith(t => {
                int exitCode;
                try {
                    exitCode = t.Result;
                } catch (Exception ex) {
                    Debug.Fail(ex.ToString());
                    exitCode = PythonTypeDatabase.InvalidOperationExitCode;
                }

                if (exitCode != PythonTypeDatabase.AlreadyGeneratingExitCode)
                {
                    _generating = false;
                }
                if (onExit != null)
                {
                    onExit(exitCode);
                }
            });
        }
        protected virtual void GenerateDatabase(PythonTypeDatabaseCreationRequest request, Action <int> onExit = null)
        {
            // Use the NoPackageManager instance if we don't have a package
            // manager, so that we still get a valid disposable object while we
            // are generating.
            var generating = _generating = (request.Factory.PackageManager ?? NoPackageManager.Instance).SuppressNotifications();

            PythonTypeDatabase.GenerateAsync(request).ContinueWith(t => {
                int exitCode;
                try {
                    exitCode = t.Result;
                } catch (Exception ex) {
                    Debug.Fail(ex.ToString());
                    exitCode = PythonTypeDatabase.InvalidOperationExitCode;
                }

                if (exitCode != PythonTypeDatabase.AlreadyGeneratingExitCode)
                {
                    generating.Dispose();
                    Interlocked.CompareExchange(ref _generating, null, generating);
                }
                onExit?.Invoke(exitCode);
            });
        }