Определение состояния простоя и выход пользователя из системы (WinForms) - PullRequest
1 голос
/ 24 июля 2010

В настоящее время я разрабатываю систему, для которой требуется время ожидания сеанса, например подсистему.Это компактное приложение Framework 3.5, но принципы очень похожи на WinForms, поэтому большинство решений Winforms, скорее всего, будут работать.который управляет шоу, знайте, что пользователь ничего не сделал в течение 20 м, поэтому вызовите функцию выхода из системы и вернитесь к форме входа в систему.Мне кажется, что это пахнет и слишком упрощенно, поскольку предполагает, что ВСЕ действия направляются через кнопку.Я думаю, что у приложения или системы должен быть способ узнать, когда с ним взаимодействуют.

public partial class MainWindow : Window
{
    private FlowBase CurrentFlow { get; set; }

    private TimerService _service;
    private TimerService CurrentTimerService
    {
        get { return _service ?? (_service = new TimerService()); }
    }

    private TimeSpan _allowedInactivityTime = TimeSpan.FromSeconds(10);
    private TimeSpan _currentInactivityTime = TimeSpan.FromSeconds(0);

    public MainWindow()
    {
        InitializeComponent();
        GoToMainMenu();

        CurrentTimerService.OnTick += (increment) =>
                                        {
                                            if (_currentInactivityTime >= _allowedInactivityTime)
                                            {
                                                ResetInactivityTimer();
                                                GoToMainMenu();
                                            }

                                            _currentInactivityTime = _currentInactivityTime.Add(increment);
                                        };
    }

    private void ResetInactivityTimer()
    {
        _currentInactivityTime = TimeSpan.FromSeconds(0);
    }

    private void btnExit_Click(object sender, RoutedEventArgs e)
    {
        if (ccContent.Content is MainMenu)
            Close();
        else
            CurrentFlow.ExitFlow();
    }

    private void btnNext_Click(object sender, RoutedEventArgs e)
    {
        ResetInactivityTimer();
        ccContent.Content = CurrentFlow.Process(null);
    }

    private void GoToMainMenu()
    {
        var mm = new MainMenu();
        mm.OnFlowSelected += (flow) =>
        {
            CurrentFlow = flow;
            CurrentFlow.OnExit += GoToMainMenu;
            ccContent.Content = flow.Initialize();
        };

        ccContent.Content = mm;
    }
}

Заранее благодарен за любую помощь

1 Ответ

0 голосов
/ 24 июля 2010

Ваш дизайн правильный.Естественная концепция тайм-аута реализована вашим таймером.Если вы вручную сбрасываете таймер для каждого из ваших вызовов, попробуйте использовать любое событие, которое запускается при взаимодействии пользователя с пользовательским интерфейсом. Вот список .

Но, ИМО, ваше решение в порядке.Вот как работает большинство функций управления сессиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...