public async Task Start(CancellationToken token, ConsoleRunnerDataReceived outputCallback)
        {
            outputCallback(this, "started");
            while (!token.IsCancellationRequested)
            {
                if (Baypass())
                {
                    outputCallback(this, "bypass");
                    try
                    {
                        await Task.Delay(_verifyInterval, token);
                    }
                    catch (TaskCanceledException ex)
                    {
                    }
                    continue;
                }

                outputCallback(this, "ping");

                if (!await Ping())
                {
                    _connected = false;
                    outputCallback(this, "start reconnecting");
                    var reconnectingResult = await Reconnect();

                    if (reconnectingResult)
                    {
                        outputCallback(this, "reconnected success");
                    }
                    else
                    {
                        outputCallback(this, "disconnected state");
                    }
                }
                else
                {
                    _connected = true;
                }

                if (token.IsCancellationRequested)
                {
                    break;
                }

                outputCallback(this, "wait");
                try
                {
                    await Task.Delay(_verifyInterval, token);
                }
                catch (TaskCanceledException ex)
                {
                }
            }
            outputCallback(this, "stopped");
        }
        public ConnectManager(ConnectManagerConfig config, ConsoleRunnerDataReceived outputCallback)
        {
            _runner = new AsyncConsoleRunner();
            _runner.OnConsoleRunnerDataReceived      += (s, p) => outputCallback(this, p);
            _runner.OnConsoleRunnerErrorDataReceived += (s, p) => outputCallback(this, p);

            _ping = new Ping();

            _address           = config.PingAddress;
            _clientPath        = config.VpnClientPath;
            _connectCommand    = $" connect \"{config.VpnProfileName}\"";
            _disconnectCommand = $" disconnect";

            _delay          = config.ReconnectDelay;
            _verifyInterval = config.VerifyPeriod;
            _connected      = false;

            _enabledBypass = config.EnableBypassTime;
            _bypassFrom    = config.BypassFrom;
            _bypassTo      = config.BypassTo;
        }